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

‘{имясцепки} ’.  Сама метка не копируется в ‘ChangeLog’. Например, предположим, что есть такие журнальные записи:

Для ‘vc.texinfo’: ‘{expand}  Fix  expansion  typos.’

Для ‘vc.el’: ‘{expand}  Don’t  call expand-file-name.’

Для ‘vc-hooks.el’: ‘{expand}  Don’t  call expand-file-name.’

Тогда текст в ‘ChangeLog’ выглядит так:

1999-04-01   Nathaniel Bowditch   <nat@apn.org>

* vc.texinfo:  Fix  expansion  typos.

* vc.el, vc-hooks.el:  Don’t  call expand-file-name.

Журнальные записи, чей текст  начинается с ‘#’,  не  копируются в ‘ChangeLog’. Например, если вы просто поправили грамматические ошибки в комментариях, вы можете сделать в журнале запись, начинающуюся  с ‘#’, чтобы в ‘ChangeLog’ не заносились  столь тривиальные вещи.

14.7.8.2  Переименование файлов под VC

Когда вы переименовываете зарегистрированный  файл, вы должны переименовать также соответствующий  мастер-файл, чтобы получить правильный результат. Используйте vc-rename-file, чтобы переименовать исходный файл, как вы укажете, и соответственно его мастер-файл.  Это также обновит все снимки (см. Раздел 14.7.7 [Снимки], с. 126), которые упоминают данный файл, так что они будут использовать  новое имя; несмотря на это, измененный таким образом снимок может не работать (см.  Раздел 14.7.7.2 [Снимки Опасные места], с. 126).

Вы не  можете  использовать vc-rename-file  для файла, который блокирован кем-то еще.

14.7.8.3  Вставка заголовков версий

Иногда удобно помещать строки для идентификации версии прямо в рабочие файлы. Некоторые особые строки, называемые заголовками  версии, заменяются в каждой версии на ее номер.

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

этих файлов. Это более надежно, чем обращение к мастер-файлам, которое делается, если заголовков версий нет.  Заметьте,  что в среде с несколькими ветвями заголовки версий необходимы для корректной работы VC (см. Раздел 14.7.6.4 [Многопользовательские  ветви], с. 125).

Переменная vc-consult-headers управляет поиском заголовков версий. Если она отлична от nil,  Emacs производит поиск заголовков, чтобы узнать номер версии, которую вы редактируете. Установка этой переменной в nil выключает это средство.

Для вставки подходящей строки заголовка вы можете  использовать команду C-x v h

(vc-insert-headers).

C-x v h      Вставляет в файл заголовки для использования с вашей системой управления версиями.

Стока заголовка по умолчанию — это ‘$Id$’  для RCS и ‘%W%’  для SCCS. Вы можете указать другие вставляемые заголовки, устанавливая  переменную vc-header-alist.  Ее значение — это список элементов в форме (программа . строка),  где  программа — это RCS или SCCS, а строка — это используемая строка.

Вместо одной строки вы можете задать список строк; тогда каждая строка из списка вставится как отдельный заголовок на отдельной строке.

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

Каждый заголовок вставляется в точке на новой строке, в окружении знаков табуляции внутри ограничителей комментария. Как  правило, используются  обычные для текущего режима строки для начала и завершения комментария, но в некоторых режимах для этой цели есть особые ограничители комметариев; их определяет переменная vc-comment-alist. Каждый элемент в этом списке имеет форму (режим начало конец).

Переменная vc-static-header-alist указывает, какие еще строки должны добавляться в зависимости от имени буфера. Ее значение должно быть списком элементов в форме  (regexp . формат).    Когда  regexp соответствует имени буфера,  как  часть загловка вставляется формат.  Строка загловка вставляется для каждого элемента, совпадающего с именем  буфера, и для каждой строки, указанной в vc-header-alist.  Строка загловка получается путем форматирования строки из vc-header-alist с форматом, взятым из элемента vc-static-header-alist.  По умолчанию vc-static-header-alist имеет следующее значение:

(("\\.c$" .

"\n#ifndef lint\nstatic char  vcid[] = \"\%s\";\n\

#endif /* lint */\n"))

Это определяет вставку текста в такой форме:

#ifndef lint

static char  vcid[] = "строка";

#endif /* lint */

Заметьте, что текст выше начинается с пустой строки.

Если вы хотите  использовать в файле  более одного заголовка версии, помещайте  их рядом. Механизм сохранения меток в revert-buffer может не обработать  метки, расположенные между двумя заголовками.

14.7.9  Настройка VC

Есть много способов настройки VC. Параметры, которые вы можете установить, разде-

ляются на четыре катагории, описанные в последующих разделах.

14.7.9.1  Параметры для постпроцессора VC

Вы можете сказать RCS и CVS, должны ли они использовать для файла блокирование или не должны (см. Раздел 14.7.1.2 [Концепции VC], с. 117, для получения описания блокирования). VC автоматически распознает, что вы выбрали, и ведет себя соответственно.

В RCS по умолчанию применяется блокирование, но есть режим, называемый нестрогим блокированием,  в котором вы можете  фиксировать  изменения без предварительного блокирования  файла. Используйте ‘rcs  -U’ для переключения к нестрогому блокированию для некоторого файла, подробности  смотрите в документе Man ‘rcs’.

Под CVS блокирование по умолчанию не применяется;  каждый может изменять рабочий файл в любое время. Однако, есть способы ограничить это, дающие в результате поведение, похожее на блокирование.

С одной стороны, вы можете  установить переменную среды CVSREAD  в произвольное значение. Если эта переменная определена, CVS делает ваши рабочие файлы доступными только для чтения по умолчанию. В Emacs вы должны набрать C-x C-q, чтобы сделать файл доступным для записи, так что редактирование  рабочих файлов фактически похоже на редактирование с применением блокирования.  Заметьте однако, что фактически блокировки не происходит, поэтому несколько пользователей могут одновременно сделать свои рабочие файлы записываемыми.  Когда вы устанавливаете CVSREAD первый раз, обязательно заново извлеките все ваши модули, чтобы защита файлов была правильно выставлена.

Другой способ достичь чего-то похожего на блокировку — воспользоваться средством наблюдения в CVS.  Если над файлом установлено  наблюдение, CVS по умолчанию делает его доступным только для чтения, и вы также  должны использовать в Emacs C-x C-q, чтобы сделать его записываемым. Чтобы сделать файл доступным для записи, VC вызывает cvs edit, и CVS заботится о том, чтобы другие разработчики были оповещены о вашем намерении изменить этот файл. Подробности об использовании средства наблюдения смотрите в документации по CVS.

Вы можете подавить использование VC для файлов, управляемых CVS, установив переменную vc-handle-cvs в nil.  Если вы сделаете так, Emacs считает эти файлы незарегистритованными, и команды VC становятся в них недоступными. Тогда вы должны делать все операции  CVS вручную.

14.7.9.2  Управление рабочими файлам в VC

Обычно Emacs не сохраняет резервные копии для исходных файлов, которые находятся под контролем системы управления версиями. Если вы хотите  делать резервные копии даже для таких файлов, установите переменную vc-make-backup-files в отличное от nil значение.

Как  правило рабочие файлы существуют всегда, блокированы они или нет.  Если вы установите vc-keep-workfiles в nil, то при фиксировании новой версии с помощью C-x C-q рабочий файл будет удаляться; но любая попытка обратиться к этому файлу из Emacs создаст его снова. (Под CVS рабочие файлы остаются всегда.)

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

Переменная vc-follow-symlinks говорит, что нужно делать, когда символьная ссылка указывает на файл с управлением версиями. Если она равна nil,  VC лишь показывает предупреждающее  сообщение.  Если это t,  VC автоматически следует по ссылке и обращается к настоящему файлу, сообщая вам об этом в эхо-области. Если это значение равно ask (по умолчанию), VC всякий раз спрашивает вас, нужно ли проследовать по ссылке.

14.7.9.3  Как VC узнает  статус файла

При вычислении статуса блокировки файла, VC сначала ищет в нем строку заголовка версии RCS (см.  Раздел 14.7.8.3 [Заголовки версии], с. 128). Если строки заголовка нет, или если вы пользуетесь SCCS, VC обычно смотрит на разрешения, установленные для рабочего файла; это быстро. Но могут быть ситуации, когда разрешениям нельзя доверять. В таком случае делается обращение к мастер-файлу, что довольно дорого.  Кроме  того, мастер-файл  может только  сказать, заблокирован ли файл кем-то, но не  то,  что  ваш рабочий файл содержит именно эту блокированную версию.

Вы можете указать VC не использовать  заголовки версии для определения статуса блокировки, установив vc-consult-headers в nil.   Тогда VC всегда использует для этого биты разрешений для файла (если она может им доверять) или проверяет мастер-файл.

Вы можете  задать критерий, по которому следует доверять разрешениям для файла, с помощью переменной vc-mistrust-permissions.  Ее значением может быть t (никогда не  доверять битам разрешений  и всегда проверять мастер-файл),  nil (всегда доверять разрешениям) или функция с одним аргументом, которая принимает решение. Аргумент

— это имя подкаталога ‘RCS’, ‘CVS’ или ‘SCCS’. Отличное от nil значение из этой функции говорит,  что битам разрешений доверять нельзя. Если вы обнаружили, что разрешения для рабочего файла выстановлены  ошибочно, установите  vc-mistrust-permissions в t. Тогда VC всегда будет проверять мастер-файл для определения статуса файла.

14.7.9.4  Выполнение команд в VC

Если vc-suppress-confirm отлична от nil, то C-x C-q и C-x v i могут сохранять текущий буфер без запроса,  и C-x v u также работает  без подтверждения. (Эта переменная не влияет на C-x v c; данная операция насколько значительна, что для нее всегда  нужно спрашивать подтверждение.)

Режим VC делает большую часть работы, запуская команды оболочки для RCS, CVS и SCCS. Если vc-command-messages отлична от nil, VC выводит сообщения, показывающие, какие команды оболочки запускаются, и дополнительные  сообщения, когда команда завершается.

Вы можете задать дополнительные каталоги для поиска программ управления версиями, устанавливая переменную vc-path. Эти каталоги просматриваются  перед обычным путем поиска. Но обычно правильные файлы находятся автоматически.

14.8  Каталоги файлов

Файловая система группирует файлы по каталогам. Распечатка каталога — это список всех файлов в каталоге. Emacs предоставляет команды для создания и удаления каталогов и для выдачи распечатки каталогов в кратком  формате (только имена файлов)  и в подробном формате (включающем  размеры, даты и авторов). Есть также броузер каталогов, называемый Dired; смотрите Глава 28 [Dired], с. 291.

C-x C-d катилиобразец hRETi

Выводит краткую распечатку каталога (list-directory).

C-u C-x C-d катилиобразец hRETi

Выводит подробную распечатку каталога.

M-x make-directory hRETимякат hRETi

Создает новый каталог с именем имякат.

M-x delete-directory hRETимякат hRETi

Удаляет каталог с именем имякат. Он должен быть пуст, иначе вы получите ошибку.

Команда для вывода распечатки каталога — это C-x C-d (list-directory).  Она считывает, используя минибуфер,  имя файла, который является либо каталогом, который нужно распечатать,  либо шаблоном имен файлов, которые нужно перечислить. Например,

C-x C-d /u2/emacs/etc hRETi

перечисляет все файлы в каталоге  ‘/u2/emacs/etc’.  Вот пример описания образца имен файлов:

C-x C-d /u2/emacs/src/*.c hRETi

Обычно C-x C-d печатает краткий перечень каталога, содержащий только имена файлов. Числовой аргумент (независимо от значения) велит показывать подробную распечатку (как ‘ls -l’).

Текст  распечатки каталога получается от  ls,  запущенной в подчиненном процессе. Две переменные Emacs управляют ключами, передаваемыми ls:  list-directory-briefswitches  — это строка, дающая ключи для использования в кратких распечатках ("-CF" по умолчанию), и list-directory-verbose-switches — ключи для подробной распечатки ("-l" по умолчанию).

14.9  Сравнение файлов

Команда M-x diff сравнивает два файла, показывая различия в буфере Emacs с именем

‘*Diff*’.   Она запускает программу diff,  используя ключи, получаемые из переменной

diff-switches, чье значение должно быть строкой.

Буфер ‘*Diff*’ имеет в качестве основного режим Compilation,  поэтому вы можете использовать C-x ‘,  чтобы последовательно обратиться к  изменившимся местам в двух исходных файлах. Вы также можете перейти к конкретному ломтю изменений и нажать hRETi  или C-c C-c, или щелкнуть на нем Mouse-2, чтобы перейти к соответствующей позиции в исходном тексте.  Вы также можете использовать другие особые команды режима Compilation:  hSPCi  и hDELi  для прокрутки  и M-p и M-n для передвижения курсора.  См. Раздел 23.1 [Компиляция], с. 247.

Команда M-x diff-backup сравнивает заданный файл с его самой последней резервной копией. Если вы задали имя резервного  файла, diff-backup сравнивает его с исходным файлом.

Команда M-x compare-windows сравнивает текст в текущем окне с текстом следующего окна.  Сравнение начинается от точки в каждом окне,  и обе начальные  позиции вталкиваются в список пометок соответствующего  буфера. Затем точка перемещается в каждом окне вперед по одному знаку, пока не будет найдено несовпадение. Тогда эта команда останавливается. Для получения большей информации об окнах в Emacs смотрите Глава 16 [Окна], с. 141.

С числовым аргументом, compare-windows игнорирует изменения в пропусках.  Если переменная  compare-ignore-case не nil,  она игнорирует также  и различия в регистре букв.

Смотрите также Раздел 22.14 [Emerge],  с. 231, описание удобных средств для слияния двух похожих файлов.

14.10  Разнообразные действия над файлами

В Emacs есть команды для произведения многих других операций над файлами. Все они действуют на один файл; они не воспринимают  имена файлов с шаблонами.

M-x view-file позволяет вам просмотреть или прочитать файл по целым экранам. Она считывает имя файла, используя  минибуфер.  После загрузки файла в буфер Emacs, viewfile показывает его начало. Теперь вы можете нажать hSPCi, чтобы прокрутить вперед на

целое окно, или hDELдля прокрутки назад. Предоставляются и другие различные команды для перемещения по файлу, но не для его изменения; наберите во время просмотра ?, чтобы получить их перечень. Это практически те же обычные команды Emacs для передвижения курсора.   Чтобы выйти из просмотра, наберите  q.   Команды просмотра определяются особым основным режимом, называемом режимом View.

Есть родственная команда, M-x view-buffer,  для просмотра буфера, уже  существую-

щего в Emacs. См. Раздел 15.3 [Буферы Разное], с. 136.

M-x insert-file  вставляет копию содержимого заданного файла в текущий буфер  в позиции точки, оставляя точку неизменной перед вставленным  и метку после него.

M-x write-region — это обращение M-x insert-file; она копирует содержимое области в указанный файл. M-x append-to-file добавляет текст области в конец заданного файла. См. Раздел 9.3 [Накопление текста], с. 73.

M-x delete-file удаляет указанный файл, как команда оболочки rm. Если вы хотите удалить много файлов в одном каталоге, может оказаться удобнее воспользоваться  Dired (см. Глава 28 [Dired], с. 291).

M-x rename-file считывает, используя минибуфер, два имени файла, старый и новый, а затем переименоывает  файл старый в новый. Если файл с именем новый уже существует, вы должны подтвердить  переименование вводом yes, или переименование не производится; это сделано, потому что такое переименование приведет к потере старого значения имени новый.   Если старый и новый находятся на разных файловых  системах, файл старый копируется и удаляется.

Похожая команда M-x add-name-to-file используется для добавления еще одного имени существующему  файлу без удаления старого имени. Новое имя обязано принадлежять той же файловой системе, где находится сам файл.

M-x copy-file считывает файл старый и записывает новый файл с именем новый с тем же содержимым. Если файл с именем новый уже существует, требуется подтверждение, потому что копирование затирает старое содержимое файла новый.

M-x make-symbolic-link считывает два имени файла, цель и имяссылки, а затем создает символьную ссылку с именем имяссылки, указывающую на цель.  Это проявится в том, что будущие попытки открыть  файл имяссылки получат тот файл, который называется цель во время открытия,  или получат ошибку, если имя цель в это время не используется.  Эта команда не  раскрывает аргумент цель, поэтому она позволяет вам указать относительное имя в качестве файла назначения ссылки.

Если имяссылки занято, требуется подтверждение. Обратите внимание,  не все системы поддерживают символьные ссылки.

14.11  Доступ к сжатым файлам

Emacs поставляется с библиотекой, которая автоматически распаковывает сжатые файлы, когда вы к  ним обращаетесь,  и автоматически сжимает их снова, если вы их изменили и  сохраняете.    Чтобы  задействовать эту  возможность, наберите  команду M-x auto-compression-mode.

Когда включено автоматическое сжатие (что подразумевает и автоматическую распа-

ковку),  Emacs распознает сжатые файлы по именам. Имена файлов, завершающиеся  на

‘.gz’,  указывают, что этот файл сжат программой gzip.   Другие окончания обозначают другие методы сжатия.

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

14.12  Удаленные файлы

Вы можете сослаться на файлы на других машинах, используя особый синтаксис имен:

/машина:имяфайла

/пользователь@машина:имяфайла

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

Обычно, если вы не задали имя пользователя в имени удаленного  файла, это означает, что нужно использовать  ваше собственное пользовательское имя. Но если вы установите переменную ange-ftp-default-user равной какой-то строке, то будет использоваться эта строка. (Пакет Emacs, который реализует доступ к файлам по FTP, называется ange-ftp.)

Вы можете полностью выключить обработку имен FTP-файлов, установив переменную

file-name-handler-alist в значение nil.

14.13  Буквальные имена файлов

Вы можете отменить особый смысл абсолютного  имени файла, чтобы блокировать дей-

ствие специальных символов и синтаксиса. Это можно сделать, добавив ‘/:’ в начале.

Например, вы можете  отменить особый смысл имени локального файла, который выглядит как удаленный, чтобы предотвратить его трактовку как имени удаленного файла. Таким образом, если у вас есть каталог с именем ‘/foo:’ и в нем файл с именем ‘bar’,  вы можете сослаться в Emacs на этот файл как на ‘/:/foo:/bar’.

‘/:’  также  может предотвратить понимание ‘~’ как  специального символа, обозначающего начальный каталог этого пользователя. Например, ‘/:/tmp/~hack’ ссылается на файл с именем ‘~hack’ в каталоге ‘/tmp’.

Аналогично, использование ‘/:’ — это один из способов ввести в минибуфере имя файла, содержащее  ‘$’.   Однако, ‘/:’  обязана быть в начале этого буфера,  чтобы блокировать эффект ‘$’.

С помощью ‘/:’ вы также можете подавить эффект символов подстановки при обращении к файлам.  Например, ‘/:/tmp/foo*bar’ обращается к файлу ‘/tmp/foo*bar’. Однако, чаще всего вы просто можете ввести символы подстановки как есть. Например, если единственное имя файла в ‘/tmp’,  которое начинается на ‘foo’  и завершается на ‘bar’  — это

‘foo*bar’, то указав ‘/tmp/foo*bar’ вы обратитесь только к ‘/tmp/foo*bar’.

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

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

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

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