Привет, коллеги. Бывает обидно потерять сделанную работу при внезапном крахе системы, обрыве связи (если вы редактируете по ssh), зависании или отключении электричества.
Мы уже обсуждали способ настроить автосохранение, например, при каждом выходе из режима вставки, или привязку :w к F2 или другой клавише. Однако Вим и сам принимает меры для защиты. По сути, Вим сохраняет swap-файл. Узнать его имя можно так:
:swapname
Обычно это имя файла с точкой в начале и дополнительным расширением .swp, которое может меняться, если файл уже существует (остался с какого-то сбоя). В последнем случае расширение начинает уменьшаться на единицу (в алфавитном порядке: swo, swn, вплоть до saa, а потом уже своп-файлы не создаются; не забывайте чистить свои каталоги от своп-файлов, если часто давите reset!) Если файл уже есть, он никогда не перезаписывается, но выдается предупреждение. При нормальном закрытии файла его своп удаляется, но только текущий, активный.
Своп-файл создается в том же каталоге, что и сам файл. Но это можно изменить, настроив опцию directory. Она содержит список каталогов через запятую, по умолчанию .,~/tmp,/var/tmp,/tmp
Используется первый подходящий каталог. Путь "точка" означает "тот же каталог, где файл". Обычно он подходит, хотя бывает по-всякому, если файл, например, с недоступного для записи устройства. Можно начать путь с ./ , что означает "относительно файла". Например, ./swap будет помещать все своп-файлы в подкаталог swap (который должен быть предварительно вами создан, конечно). Если путь заканчивается на // , то имя своп-файла содержит весь полный путь, только разделители заменяются на %. Это гарантирует уникальность имени и можно складывать все своп-файл куда-нибудь в tmp
Рекомендуется ставить точку первой и не рекомендуется использовать /tmp: этот каталог очищается при перезагрузке. Можно использовать переменные окружения. Пустая опция означает "не надо своп-файлов".
Плюсы складирования своп-файлов в другом месте: каталог не загромождается своп-файлами и, если они физически на другом диске, то у них больше шансов уцелеть при крахе файловой системы. Минусы: могут возникнуть конфликты имен, могут возникнуть проблемы при редактировании файла, доступного нескольким пользователям.
Если у вас мало места или не хочется часто записывать (флешки, например), то может быть удобно поместить своп куда-то еще. Да и при выходе флешки из строя файл уцелеет. В общем, смотрите сами.
Отменить создание своп-файла в целом можно, выставив directory в пустую строку. Но это радикально. Для конкретного буфера есть swapfile. Если его сбросить, своп будет удален. Это может быть полезно для конфиденциальности: даже сисадмин не увидит, что вы там печатаете!
Имейте в виду, что своп используется для сброса части крупных файлов для освобождения памяти. Так что без свопа весь файл придется держать в памяти: в случае гигабайтных файлов это может быть непросто.
Еще есть команда :noswapfile. Команда, выполненная через эту, не будет создавать своп или удалит уже созданный. Например, так можно создать новый файл без свопа: :noswapfile tabnew
Своп-файл обновляется каждые 200 символов или после паузы в 4 секунды. Эти числа можно настроить опциями updatecount и updatetime (в мс). Можно приостановить запись в своп-файл, задав 0 в updatecount. Того же можно добиться, запустив Вим с ключом -n
Можно принудительно сбросить все изменения в своп-файл командой :preserve: это действует на все буферы и сохраняет их целиком, так что для восстановления сами файлы вообще не требуются. Если флаг & присутствует в cpoptions, то своп-файл не удаляется при выходе из Вим, если буфер загружен.
Своп-файл можно распознать по первым шести символам: "b0VIM ", потом идет номер версии.
Зашифрованные файлы имеют зашифрованные же своп-файлы, так что восстановление становится более сложным (придется ввести ключ один или два раза).
Операционная система не всегда сразу записывает файл на диск: возможно кеширование. Вим сразу синхронизирует файл с диском (fsync), что безопасно, но может занимать время. Можно выставить swapsync в пустую строку. Тогда синхронизация отключена, мы полагаемся на систему, но если всё упадет до того, как система соизволит физически записать файл, то ой.
Восстановить файл после краха можно несколькими способами. Достаточно открыть Вим так:
vim -r filename
Вим использует своп-файл и сам файл и попытается восстановить, и даст отчет. Предложит сохранить файл под другим именем и воспользоваться vimdiff для сличения, а также удалить своп.
Если файл ни разу не сохранялся, восстановить тоже можно, указав пустую строку:
vim -r ""
В качестве аргумента можно указать и сам своп-файл. В нем сохранено имя файла.
Можно просто открыть файл: если Вим найдет своп к нему, он предупредит и предложит выбор: открыть файл для чтения, редактировать всё равно, восстановить, выйти, выйти прервав все действия (например, прервать загрузку сессии), удалить своп. Последний вариант доступен только тогда, когда процесс, который создал своп, не работает (насколько может судить Вим).
Есть команда :recover, чтобы запустить восстановление файла. По умолчанию — текущий, либо можно указать имя. С восклицательным знаком, как обычно, игнорирует несохраненные изменения.
Вот так Вим заботится о Вас.