Работа  с файлами – ЧАСТЬ 1

Операционная система хранит постоянные даные в именованных файлах. Поэтому большая часть текста, который вы редактируете в Emacs, приходит из файлов и в конечном итоге записывается в файл.

Чтобы редактировать файл, вы должны велеть Emacs считать его и подготовить буфер, содержащий  копию текста файла. Это называется обращением к файлу. Команды редактирования применяются непосредственно к тексту в буфере, то есть к копии внутри Emacs. Ваши изменения появляются в самом файле, только когда вы сохраните буфер в файле.

Кроме обращения к файлам и их сохранения Emacs может удалять, копировать, пере-

именовывать и добавлять в файлы и работать с каталогами файлов.

14.1  Имена  файлов

Большинство команд Emacs, которые оперируют с файлами, требуют от вас указания имени файла. (Запись и восстановление являются исключением;  буферу известно, какое имя файла используется  для них.) Имена файлов задаются с использованием минибуфера (см.  Глава 5 [Минибуфер], с. 45).  Вы можете  использовать  завершение для облегчения написания длинных имен файлов. См. Раздел 5.3 [Завершение], с. 47.

Для большинства операций существует имя файла по умолчанию, которое будет использовано,  если вы наберете просто hRETi,  вводя пустой аргумент.  Обычно имя файла по умолчанию — это имя файла, находящегося  в текущем буфере, что упрощает действия над этим файлом с помощью любых файловых команд Emacs.

Каждый буфер имеет свой каталог по умолчанию, обычно тот же самый, что и каталог файла, к которому обращается этот буфере. Когда  вы вводите имя файла,  не указывая каталог, он использует каталог по умолчанию. Если вы зададите каталог в относительной форме, с помощью имени, которое не начинается  с косой черты, оно интерпретируется по отношению к  каталогу по умолчанию.  Каталог  по умолчанию хранится в переменной default-directory, которая имеет свое собственное значение в каждом буфере.

Например, если по умолчанию имя файла  — ‘/u/rms/gnu/gnu.tasks’, то каталогом по умолчанию будет ‘u/rms/gnu/’.   Если вы наберете  просто ‘foo’,  не  описывая каталог, то это будет сокращением для ‘/u/rms/gnu/foo’.  ‘../.login’ будет соответствовать

‘/u/rms/.login’. ‘new/foo’  обозначает файл с именем ‘/u/rms/gnu/new/foo’.

Команда M-x pwd печатает каталог по умолчанию для текущего буфера, а команда M-x cd устанавливает его (значение считывается в минибуфере). Каталог  по умолчанию в буфере изменяется  только тогда, когда используется команда cd. Каталог по умолчанию для буфера, обращающегося к файлу, инициализируется по каталогу файла, к которому он обратился. Если буфер создается произвольным  образом с помощью C-x b, его каталог по умолчанию копируется из того буфера, который был текущим в тот момент.

Каталог по умолчанию фактически появляется в минибуфере, когда минибуфер становится активным для чтения имени файла. Это служит двум целям: чтобы показать  вам, что имеется по умолчанию, так что вы можете набрать соответствующее имя файла и с определенностью узнать, что это будет значить, и чтобы позволить вам отредактировать каталог по умолчанию и задать другой каталог. Эта подстановка каталога по умолчанию не делается, если переменная insert-default-directory установлена равной nil.

Заметим, что законно набирать полное имя файла после того, как вы войдете в минибуфер, игнорируя присутствие имени каталога по умолчанию как части текста. Окончательное содержание минибуфера может казаться неправильным, но на самом деле это не так. Например, если сначала минибуфер содержал ‘/usr/tmp/’, и вы добавили ‘/x1/rms/foo’,

вы получите ‘/usr/tmp//x1/rms/foo’; но Emacs игнорирует все до того места, где встречены две косые черты подряд; в результате  получается ‘/x1/rms/foo’.   См.  Раздел 5.1 [Минибуфер Файл], с. 45.

Литера ‘$’ в имени файла используется для подстановки переменных среды. Например, если вы применили команду оболчки ‘export FOO=rms/hacks’  для установки переменной среды с именем FOO, то вы можете использовать ‘/u/$FOO/test.c’ или ‘/u/${FOO}/test.c’ в качестве сокращения для ‘/u/rms/hacks/test.c’.   Имя переменной  среды состоит из всех букв и цифр после ‘$’; или оно может быть заключено в фигурные скобки после ‘$’. Заметьте,  что команды оболочки, которые устанавливают переменные среды, повлияют на Emacs, только если они были выполнены до запуска Emacs.

Чтобы получить доступ к  файлу, содержащему  в имени знак ‘$’,  напечатайте  ‘$$’. Эта пара превращается в один ‘$’, в то время как для одиночного ‘$’ делается подстановка переменной. Или вы можете отменить особый смысл всех знаков в имени файла с помощью последовательности ‘/:’ (см. Раздел 14.13 [Буквальные  имена файлов], с. 134).

Лисповская функция, которая производит подстановку,  называется substitute-infile-name. Подстановка выполняется только для имен файлов, считываемых  как таковые с использованием минибуфера.

Вы можете включать в имена файлов знаки, не входящие в ASCII, если установите переменную file-name-coding-system в отличное от nil значение.  См. Раздел 18.9 [Задание кодирования], с. 168.

14.2  Обращение к файлам

C-x C-f       Обратиться к файлу (find-file).

C-x C-r       Обратиться к файлу для просмотра, не допуская его изменения  (find-fileread-only).

C-x C-v      Обратиться  к   другому   файлу,   вместо  последнего   посещенного (findalternate-file).

C-x 4 f   Обратиться к файлу в другом окне (find-file-other-window).  Не меняет те-

кущее окно.

C-x 5 f   Обратиться к файлу в другом фрейме (find-file-other-frame).  Не изменяет то, что отображется в выбранном фрейме.

M-x find-file-literally

Обратиться к файлу без преобразования  его содержимого.

Обращение к файлу означает копирование его содержимого в буфер Emacs, где вы можете его редактировать. Emаcs создает новый буфер для каждого файла, к которому вы обращаетесь. Мы говорим, что этот буфер обращается к файлу, для хранения которого он был создан. Emacs создает имя буфера из имени файла, отбрасывая  каталог и сохраняя просто собственно имя. Например,  файл с именем ‘/usr/rms/emacs.tex’ получит буфер с именем ‘emacs.tex’.  Если буфер с таким именем уже существует, то создается уникальное имя путем добавления ‘<2>’, ‘<3>’ и так далее; при этом используется наименьший номер, создающий  еще не используемое имя.

Строка режима каждого окна показывает имя буфера, который отражен в этом окне,

таким образом вы всегда можете сказать, какой буфер редактируете.

Все изменения, сделанные  при помощи команд редактирования, делаются в буфере Emacs.  Они не влияют на файл, к  которому вы обратились, или на любое другое постоянное место, пока вы не сохранили буфер. Сохранение  буфера означает, что Emacs записывает текущее  содержимое  этого буфера  в файл, к  которому он обращался. См. Раздел 14.3 [Сохранение],  с. 108.

Если буфер содержит изменения, которые не были сохранены, то о буфере говорится, что он изменен (или модифицирован).  Это важно, так как это подразумевает, что какието изменения потеряюся,  если буфер не будет сохранен. Если буфер изменен, около левого края строка режима показываются  две звездочки.

Чтобы обратиться к файлу, используйте команду C-x C-f  (find-file).  После нее вве-

дите имя файла, который вы хотите посетить, ограниченное hRETi.

Имя файла считывается  с использованием минибуфера (см. Глава 5 [Минибуфер], с. 45) с использованием значений по умолчанию и завершением стандартным способом (см. Раздел 14.1 [Имена файлов], с. 105). Пока вы находитесь в минибуфере, вы можете прервать выполнение C-x C-f, набрав C-g.

Подтверждением того, что C-x C-f  завершилась удачно, служит появление нового текста на экране и нового имени буфера в строке режима. Если указанный  файл не существует и не может быть создан или считан, тогда возникает ошибка. Сообщение о ней печатается в эхо-области.

Если вы обращаетесь к файлу, который уже  существует в Emacs, C-x C-f  не создает другой копии.  Она выбирает существующий буфер, содержащий  этот файл. Однако, перед этим она проверяет,  не изменился ли сам файл с тех пор, как вы обратились к нему или записали его в прошлый раз.  Если файл был изменен,  то будет напечатано предостерегающее  сообщение.  См. Раздел 14.3.2 [Защита от одновременного редактирования], с. 112.

А что если вы захотите создать новый файл?  Просто обратитесь к нему. Emacs печатает в эхо-области ‘(New File)’, но в других отношениях ведет себя так же, как, если бы вы обратились бы к существующему пустому файлу. Если вы сделаете любые изменения и запишете их, то файл будет создан.

Emacs узнаёт из содержимого  файла, какое соглашение используется в нем для разделения строк — перевод строки (используемый в GNU/Linux и Unix),  возврат каретки и перевод строки (используемые в системах Microsoft) или просто возврат каретки (используемый на Macintosh) — и автоматически преобразует содержимое к обычному формату Emacs, в котором строки разделяются знаками перевода строки.  Это часть общего средства преобразования системы кодирования (см. Раздел 18.7 [Системы кодирования], с. 165), и это позволяет редактировать файлы, перенесенные с различных операционных систем с одинаковым удобством. Если вы изменили текст и сохранили файл, Emacs производит обратное преобразование, заменяя переводы строки на возврат каретки и перевод строки или просто возврат каретки, если это необходимо.

Если указанный вами файл фактически является каталогом, то C-x C-f вызывает Dired, броузер каталогов Emacs, чтобы вы могли “редактировать” содержимое этого каталога (см. Глава 28 [Dired], с. 291). Dired предоставляет удобный способ удаления,  просмотра или обработки файлов в каталоге.  Однако, если переменная find-file-run-dired равна nil, попытка обратиться к каталогу будет считаться ошибкой.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий