Справочник по VIM

Восстановление после аварии

СПРАВОЧНИК ПО VIM — Брам Мооленаар

Представьте себе, что вы потратили несколько часов на набор текста, который надо закончить к следующему утру, и в этот момент происходит катастрофа: ваш компьютер виснет.

БЕЗ ПАНИКИ!

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

vim -r filename
  1. Своп-файл
  2. Восстановление

1. Своп-файл

Vim сохраняет внесённые изменения в своп-файле. Вы можете восстановить большую часть работы при помощи сохранённого варианта документа и своп-файла.

Имя текущего своп-файла можно посмотреть при помощи команды

:sw[apname]

Как правило, имя своп-файла такое же, как и у редактируемого файла, с добавлением расширения «.swp«.

  • На системах Unix в начале имени своп-файла в том же каталоге, что и редактируемый файл, добавляется ‘.‘, чтобы не показывать своп-файл в списке файлов в каталоге.
  • На машинах с MS-DOS при включённой опции ‘shortname‘ все ‘.‘ в имени оригинального файла заменяются на ‘_‘.
  • Если файл с именем своп-файла уже существует, например — в том случае, когда вы восстанавливаетесь после аварии, то будет выдано предупреждение и создан своп-файл с другим расширением, «.swo«, «.swn» и т.д.
  • Существующий своп-файл ни при каких условиях не будет перезаписан.
  • Своп-файл удаляется сразу же после того, как Vim завершает работу с файлом.

Технические детали: Замена ‘.‘ на ‘_‘ позволяет избежать проблем на MS-DOS-совместимых системах (например, crossdos, multidos). Если Vim способен обнаружить, что файл находится на MS-DOS-подобной файловой системе, то устанавливается флаг, который имеет тот же эффект, что и включение опции ‘shortname‘. Этот флаг отключается при редактировании другого файла.
Если файл с расширением «.swp» уже существует, то последний символ будет уменьшаться до тех пор, пока не будет создан файл с несуществующим пока именем, если не обнаружен файл с расширением «.saa«. В последнем случае своп-файл перестаёт создаваться.

Своп-файл можно разместить в каталоге, отличном от каталога, в котором находится редактируемый файл, при помощи опции ‘directory‘.

Преимущества:

  • Ваши каталоги не будут замусориваться файлами «.swp«.
  • Если опция ‘directory’ указывает на другой раздел, то уменьшается риск повреждения файловой системы, в которой находится файл (при аварии).

Недостатки:

  • Вы будете сталкиваться с большим количеством совпадений имён файлов, имеющих одно и то же имя, но размещённых в разных каталогах (хотя Vim пытается избежать таких столкновений, сравнивая пути к файлу). Это может приводить к лишним предупреждениям.
  • При использовании домашнего каталога, если кто-то другой попытается редактировать тот же самый файл, то предупреждение выдаваться не будет, так как этот Vim, запущенный этим пользователем, не увидит своп-файл в вашем домашнем каталоге.

На системе Amiga вы можете также использовать восстанавливаемый диск, размещённый в оперативной памяти компьютера, но при этом нет 100% гарантии, что это будет работать. Размещение своп-файла на обычном диске оперативной памяти(например, RAM: на Amiga), или в каталог, который очищается при перезагрузке (как /tmp на Unix) не имеет смысла, поскольку при аварии вы потеряете своп-файл.

Если вы хотите помещать своп-файлы в определённое место, то в сценарии .vimrc необходимо написать примерно следующие команды:

:set dir=dh2:tmp   (для Amiga)
:set dir=~/tmp (для Unix)
:set dir=c:\\tmp (для MS-DOS и Win32)

Это может быть очень полезным при редактировании файлов на флоппи-диске. Конечно, вам для этого потребуется создать каталог «tmp«!

Своп-файл не используется при открытии файлов в режиме «только для чтения», кроме случаев, когда файл настолько большой, что требуемое для его открытия количество памяти превышает значение, указанное в опции ‘maxmem’ или ‘maxmemtot’. При внесении изменений в открытый только для чтения файл, своп-файл будет создан.

Опция ‘swapfile‘ позволяет отключить создание своп-файла.

Обнаружение существующего своп-файла

Об этом подробно рассказывается в Руководстве Пользователя, см. раздел 11.3.

Обновление своп-файла

Своп-файл обновляется после набора 200 символов или после того, как вы не вносили изменений в файл на протяжении последних 4 секунд. Под изменениями понимается наличие изменений в буфере, а не команды перемещения по тексту. Своп-файл не обновляется чаще, чем это указано выше, потому что это было бы слишком накладно с точки зрения оптимальной производительности системы. Количество символов, после ввода которых происходит обновление своп-файла, может быть изменено с помощью опции ‘updatecount‘, а временные промежутки между обновлениями задаются с помощью опции ‘updatetime‘. Время в значении этой опции указывается в миллисекундах. После записи своп-файла Vim синхронизирует файл с физическим содержимым на диске, что отнимает некоторое время, особенно на загруженных системах Unix. Если вам не требуется синхронизация, то можно установить значение опции ‘swapsync’ равным пустой строке, однако при этом возрастает риск потери информации. На некоторых не-Unix системах (MS-DOS, Amiga) своп-файл не записывается.

Если вам не нужно обновление своп-файла, то его запись можно отключить установкой значения опции ‘updatecount‘ равным 0. Того же самого можно добиться при запуске Vim с ключом «-n«. Запись может быть возобновлена при установке ненулевого значения опции ‘updatecount‘. При этом будут созданы своп-файлы для всех открытых буферов. Однако, при установке значения ‘updatecount’ равным 0, существующие своп-файлы не удаляются — это изменение затронет только файлы, которые будут открыты после изменения значения опции.

Если вам необходимо быть уверенным, что в своп-файле сохранён весь текст, то используйте команду:

:pre[serve]Записать текст во всех буферах в своп-файлы. При этом для восстановления исходный файл больше не требуется.
Vi: срочный выход.

Своп-файл Vim начинается с байтов «b0VIM «, после которых следует номер версии, например «3.0«.

2. Восстановление

Основы восстановления файлов объясняются в руководстве пользователя: Восстановление после аварии.

Кроме того, для восстановления можно запустить Vim и ввести команду «:recover«. Это несложно сделать, если при открытии файла редактор выдаёт предупреждение «ВНИМАНИЕ Обнаружен своп-файл с именем …». В этом случае всю работу может выполнить единственная команда «:recover«. Вы можете также указать с этой командой имя файла, который нужно восстановить.

:rec[over] [файл]Попытаться восстановить указанный [файл] при помощи своп-файла. Если [файл] не указан, то используется имя файла в текущем буфере. При этом текущее содержимое буфера утрачивается. Команда не будет выполнена, если буфер содержит изменения.
:rec[over]! [файл]То же, что и «:recover», но все изменения в текущем буфере будут утрачены.

У Vim имеется достаточно интеллекта, чтобы сообразить, что надо делать, если своп-файл повреждён каким-либо образом. Если у Vim имеются сомнения по поводу того, что надо делать, что будет выдано сообщение об ошибке и в тексте появятся строки с отметками «???«. Если во время восстановления вам будет выдано сообщение об ошибке, проверьте отметки «???» в файле, чтобы выяснить, что не так. Возможно, вам потребуется внести некоторые изменения вручную.

Наиболее часто встречается отметка «???ОТСУТСТВУЮТ СТРОКИ». Это значит, что Vim не смог прочитать текст из исходного файла. Такое может произойти если система аварийно завершила работу в момент записи файла и исходный файл был сохранён лишь частично.

Убедитесь, что восстановление прошло успешно перед тем, как перезаписать оригинал файла, или перед удалением своп-файла. Хорошей привычкой может быть запись восстановленного файла под другим именем и использование ‘diff‘ для выяснения правильности восстановления.

Если вы уверены, что восстановление прошло успешно, своп файл можно удалить. Иначе вы будете постоянно получать сообщения, что своп-файл уже существует.

Vi: механизм восстановления полностью отличается. Vi отправляет сообщение по почте, если имеются данные, подлежащие восстановлению.