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

Каждый  раз, когда Emacs записывает  буфер, он сначала сверяет дату последней модификации файла, существующего  на диске, чтобы увидеть, что она не изменялась  с тех самых пор, как  к файлу обращались или его записывали  последний раз.  Если дата не совпадает,  то это означает, что изменения были произведены в файле каким-то другим способом, и что эти изменения могут быть потеряны,  если Emacs сохранит буфер на самом деле. Чтобы предотвратить это, Emacs печатает предостерегающее сообщение и запрашивает перед записью подтверждение.  Иногда вы знаете, почему файл был изменен, и знаете, что это не имеет значения; в этом случае вы можете ответить yes и продолжить редактирование. В противном случае, вы должны отменить запись с помощью C-g и исследовать ситуацию.

Первое, что вы должны сделать, когда пришло извещение об одновременном редактировании, — распечатать каталог с помощью C-u C-x C-d (см.  Раздел 14.8 [Каталоги], с. 131).  Это покажет вам текущего автора.  Вы должны будете попытаться связаться и предупредить его, чтобы он не продолжал редактирование. Чаще всего, следующий шаг

— записать содержимое вашего буфера Emacs под другим именем и использовать diff,

чтобы сравнить два файла.

14.4  Возвращение буфера

Если вы сделали обширные изменения в файле, а затем изменили ваше мнение о них, то вы можете  от них избавиться, считав предыдущую версию этого файла. Чтобы сделать это, используйте M-x revert-buffer,  она действует в текущем буфере. Так как от безусловного возврата буфера может пропасть много работы, вы должны подтвердить эту команду вводом yes.

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

Возвращение помечает буфер как “неизмененный” до тех  пор, пока не будут сделаны другие изменения.

Некоторые виды буферов, чье содержимое отражает отличные от файлов данные, такие как буферы Dired, также могут быть возвращены. Для них возвращение означает повторное считываение их содержимого из соответствующей базы данных. Буферы, созданные явно с помощью C-x b, не могут быть возвращены;  revert-buffer сообщает об ошибке, когда ее просят сделать это.

Когда вы редактируете файл, который изменяется часто и автоматически — например, протокол вывода от еще  работающего процесса  — может оказаться удобным, если бы Emacs возвращал файл без подтверждения всякий раз, когда вы снова обращаетесь к этому файлу с помощью C-x C-f.

Чтобы запросить такое поведение, установите переменную revert-without-query равной списку регулярных выражений. Когда имя файла соответствует одному из этих регулярных выражений, find-file и revert-buffer будут возвращать его автоматически, если он изменился — при условии, что сам буфер не был модифицирован. (Если вы редактировали текст, сбрасывать ваши изменения будет нехорошо.)

14.5  Самосохранение: защита от гибели

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

Когда  Emacs определяет,  что пришло время для самосохранения,  то каждый  буфер рассматривается и записывается,  если для него включено самосохранение, и он изменялся с тех пор, как последний раз был самосохранен.  Во время самосохранения в эхо-области отображается  сообщение ‘Auto-saving…’, если какой-либо файл действительно  сохраняется. Ошибки, появляющиеся во время самосохранения, отлавливаются  так,  что они не мешают выполнению набранных вами команд.

14.5.1  Файлы  для самосохранения

Самосохранение обычно не записывает  в файлы, к которым вы обратились, так  как может быть очень нежелательно записывать программу, которая находится в несогласованном состоянии, когда вы сделали  половину планируемых изменений.  Вместо этого самосохранение  делается  в другой файл, который называется  файлом для самосохранения, а посещенный файл изменяется только тогда, когда вы явно потребуете записать его (например, с помощью C-x C-s).

Обычно имя файла для самосохранения  создается добавлением знака ‘#’ перед и после имени файла,  к которому вы обратились. Таким образом, буфер, обращающийся  к файлу ‘foo.c’, будет самосохранен в файл ‘#foo.c#’.  Большинство буферов, которые не обращались  к  файлам, самосохраняются,  только если вы явно потребуете этого;  когда они автоматически записываются, имя файла для самосохранения создается добавлением к имени буфера знаков ‘#%’ в начале и ‘#’ в конце. Например,  буфер ‘*mail*’, в котором вы составляете отправляемые сообщения, самосохраняется в файл с именем ‘#%*mail*#’. Имена файлов для самосохранения конструируются таким образом, если вы не перепрограммируете часть Emacs, чтобы делалось что-то иное (функции make-auto-save-file-name  и auto-save-file-name-p). Имя файла, которое будет использоваться для самосохранения в буфере, составляется,  когда в этом буфере включается самосохранение.

Когда вы удаляете значительную  часть текста большого буфера, самосохранение в нем временно выключается. Это делается по той причине, что если вы удалили текст неумышленно, самосохраненный файл может оказаться для вас полезнее, если удаленный  текст все еще остается  в нем. Чтобы после этого снова разрешить самосохранение, запишите буфер командой C-x C-s или используйте C-u 1 M-x auto-save.

Если вы хотите, чтобы в файле, к которому вы обратились, выполнялось самосохранение, установите  переменную auto-save-visited-file-name в отличное от nil значение. В этом режиме в действительности нет различий между самосохранением и явным сохранением.

Файл самосохранений удаляется, когда вы записываете  содержимое  буфера в файл, к которому он обращался. Чтобы воспрепятствовать этому, установите переменную deleteauto-save-files равной nil.   Изменение  имени посещенного  файла с помощью C-x C-w или set-visited-file-name  переименовывает  файл для самосохранения, чтобы он соответствовал имени нового посещенного файла.

14.5.2  Управление самосохранением

Каждый раз, когда вы обращаетесь к файлу, для буфера этого файла включается  самосохранение,  если переменная auto-save-default не равна nil (но не в пакетном режиме; см.  Глава 3 [Вход в Emacs], с. 33).   По умолчанию эта переменная  равна t,  поэтому включенное  самосохранение — это обычное состояние  буферов, работающих с файлами. Самосохранение может включаться или выключаться для любого существующего буфера с помощью команды M-x auto-save-mode.  Подобно другим командам второстепенных режимов, M-x auto-save-mode включает самосохранение при положительном аргументе и выключает, когда аргумент равен нулю или отрицателен;  без аргумента она переключает режим.

Emacs производит самосохранение периодически,  основываясь на подсчете числа знаков, набранных вами с того момента, как самосохранение было сделано в последний раз. Переменная auto-save-interval определяет, сколько знаков приходится между двумя самосохранениями. По умолчанию она равна 300.

Самосохранение также производится, когда вы перестаете печатать на некоторое время. Переменная auto-save-timeout говорит, сколько секунд должен ждать Emacs то того, как сделать самосохранение (а также, возможно, и сборку мусора). (Действительный период времени больше, если теущий буфер велик; это эвристика, цель которой — не мешать вам, когда вы редактируете  длинные буферы,  самосохранение  в которых занимает заметное время.) Самосохранение во время периодов бездействия выполняет  две задачи: во-первых, оно гарантирует, что ваша работа сохраняется, если вы отошли на некоторое время от терминала; во-вторых, оно может позволить избежать самосохранения в то время, когда вы на самом деле печатаете.

Emacs также  выполняет самосохранение,  когда  получает фатальную ошибку.   Это включает уничтожение задания Emacs с помощью команды оболочки, как ‘kill %emacs’, или в результате разъединения телефонной линии или связи по сети.

Вы можете явно запросить самосохранение с помощью команды M-x do-auto-save.

14.5.3  Восстановление данных из самосохранения

Вы можете использовать  содержимое файла самосохранения для восстановления потерянных данных, запустив команду M-x recover-file hRETфайл hRETi.  Эта команда обращается к файлу и затем (после вашего подтверждения) переписывает  содержание из его самосохраненного  файла ‘#файл#’. Вы можете  потом сохранить этот буфер при помощи C-x C-s, чтобы поместить восстановленный текст в сам файл. Например,  чтобы восстановить файл ‘foo.c’ из его файла для самосохранения ‘#foo.c#’, сделайте следующее:

M-x recover-file hRETi  foo.c hRETi

yes hRETi

C-x C-s

Перед тем как  запросить у вас подтверждение, M-x recover-file показывает распе-

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

сравнить их размеры и даты. Если файл для самосохранения старше, то M-x recover-file

не предлагает  его считывать.

Если Emacs или комьютер потерпели крах, вы можете  восстановить все файлы, которые вы  редактировали, из  их  самосохраненных  файлов при  помощи команды M-x recover-session. Она сначала показывает перечень записанных прерванных сеансов. Переместите точку к нужной вам и наберите C-c C-c.

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

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

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

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