РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

Что делать, если ваш компьютер "завис" именно в тот момент, когда вы убили несколько часов редактируя тот или иной документ? Без паники, только без паники. Vim сохраняет в процессе редактирования достаточно информации для того, чтобы восстановить большую часть вашей работы. В этой главе рассказывается как восстановить эту информацию и объясняется использование своп-файла.

11.1    Основы восстановления
11.2    Где лежит своп-файл?
11.3    Была ли авария?
11.4    Дальнейшее чтение

Следующая глава: Всякие умные штучки
Предыдущая глава: Внесение серьёзных изменений
Содержание: Руководство пользователя Vim


11.1 Основы восстановления

В большинстве случаев восстановление файла является довольно простой операцией, если вы знаете над каким файлом вы работали в момент аварии, при условии, что ваш диск всё еще функционирует. Запустите Vim с этим файлом с добавлением ключа "-r" в командной строке:

vim -r help.txt

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

Используется своп-файл ".help.txt.swp" ~
Исходный файл "~/vim/runtime/doc/help.txt" ~
Восстановление завершено. Вам следует удостовериться, что всё в ~
порядке. ~
(Вы можете записать файл под другим именем и сравнить его с ~
оригинальным файлом при помощи программы diff). ~
Не забудьте удалить .swp файл. ~

Для перестраховки запишите этот файл под другим именем

:write help.txt.recovered

и сравните с оригинальным файлом, чтобы убедиться, что всё действительно в порядке. Для этой цели очень полезно использовать vimdiff |08.7|. Обратите внимание на следующие моменты: не содержит ли оригинальный файл более свежую версию (это возможно, если авария произошла сразу после того, как вы сохранили файл), не пропущены ли строки в файле.

Хотя это бывает достаточно редко, Vim может выдать предупреждения в процессе восстановления. Прочитайте их внимательно.

Небольшое количество изменений возможно не будет восстановлено. Vim сохраняет изменения на диск, когда вы прекращаете набор текста примерно на 4 секунды или после набора примерно двухсот символов. Точная настройка этих параметров содержится в опциях 'updatetime' и 'updatecount'. Если Vim не имел возможности сохранить изменения в момент системной аварии, то изменения, происшедшие после последнего сброса информации на диск, будут потеряны.

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

vim -r ""

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


11.2 Где лежит своп-файл?

Vim может хранить своп-файлы в нескольких местах. Как правило, своп-файл хранится в том же каталоге, что и редактируемый файл. Чтобы найти своп-файл, перейдите в нужный каталог и введите команду

vim -r

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

Вывод может выглядеть примерно так:

Обнаружены своп-файлы: ~
   В текущем каталоге: ~
1.    .main.c.swp ~
      владелец: mool    дата: Tue May 29 21:00:25 2001 ~
     имя файла: ~mool/vim/vim6/src/main.c ~
       изменён: ДА ~
  имя пользователя: mool   имя хоста: masaka.moolenaar.net ~
     процесс (PID): 12525 ~
       В каталоге ~/tmp: ~
          -- нет -- ~
   В каталоге /var/tmp: ~
      -- нет -- ~
   В каталоге /tmp: ~
       -- нет -- ~

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

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

ИСПОЛЬЗОВАНИЕ ОПРЕДЕЛЁННОГО СВОП-ФАЙЛА

Если вы знаете, какой своп-файл следует использовать, то при восстановлении можно указать его имя. Vim сам найдёт файл, который подлежит восстановлению по информации, содержащейся в своп-файле.

Пример:

vim -r .help.txt.swo

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

Замечание: Vim пытается найти своп-файл, просматривая каталоги, указанные в опции 'dir' в поиске файлов, соответствующих шаблону "filename.sw?". Если подстановка символов расширения работает не так, как ожидается (проверьте значение опции 'shell'), то Vim пытается найти файл "filename.swp". Если и это оказывается безуспешным, то вам потребуется указать имя своп-файла, который следует использовать, вручную.


11.3 Была ли авария?

Vim пытается предохранить вас от глупостей. Представьте, что вы невинно начинаете редактировать файл, ожидая увидеть его содержимое на экране. Вместо этого, Vim выдаёт длинное сообщение:

    E325: ВНИМАНИЕ ~
    Обнаружен своп-файл с именем ".main.c.swp" ~
          владелец: mool   дата: Tue May 29 21:09:28 2001 ~
         имя файла: ~mool/vim/vim6/src/main.c ~
           изменен: нет ~
      имя пользователя: mool   имя хоста: masaka.moolenaar.net ~
         процесс (PID): 12559 (все ещё запущен) ~
    При открытии файла "main.c" ~
              дата: Tue May 29 19:46:12 2001 ~
 ~
    (1) Этот файл может редактироваться в данный момент в другой программе.~
        Будьте внимательны, чтобы в процессе изменений у вас не оказалось ~
        два различных варианта одного и того же файла. ~
        Сейчас вы можете выйти из Vim или продолжить с осторожностью. ~
 ~
    (2) Предыдущая сессия редактирования завершилась некорректно. ~
        В этом случае используйте ":recover" или "vim -r main.c" ~
        для восстановления изменений (см. ":help recovery"). ~
        После этого удалите своп-файл ".main.c.swp", ~
        чтобы избежать этого сообщения в дальнейшей работе. ~

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

1. Файл действительно редактируется в данный момент в другом Vim. Обратите внимание на строку с сообщением "процесс (PID):". Она может выглядеть так:

процесс (PID): 12559 (все ещё запущен) ~

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

2. Своп-файл мог остаться в результате предыдущей аварии Vim или системы. Обратите внимание на даты, указанные в сообщении. Если дата своп-файла более свежая, чем дата редактируемого файла и присутствует такая строка:

изменён: ДА ~

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

более СВЕЖИЙ чем своп-файл! ~
НЕЧИТАЕМЫЙ СВОП-ФАЙЛ

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

[не читается] ~

Это может быть как хорошо, так и плохо, в зависимости от обстоятельств.

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

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

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

ЧТО ДЕЛАТЬ?

Если диалоги поддерживаются в вашей версии, то вас попросят выбрать из пяти возможностей:

Обнаружен своп-файл ".main.c.swp"!~
[O] Открыть для чтения, (E) Редактировать, (R) Восстановить, ~
(Q) Выход, (A) Прервать, (D) Удалить: ~
O Открыть файл только для чтения. Используйте эту возможность, если вы хотите посмотреть файл и не нуждаетесь в его восстановлении. Этой возможностью можно пользоваться тогда, когда вы знаете, что кто-то еще редактирует этот файл, и просто хотите взглянуть на него не внося никаких изменений.
E Редактировать файл, несмотря на предупреждение. Используйте эту возможность с осторожностью! Если файл редактируется в другом Vim, то в итоге окажется, что у файла две версии. Vim  постарается вас предупредить об этом, но лучше перестраховаться.
R Восстановить файл из своп-файла. Используйте эту возможность в том случае, когда вы точно знаете, что в своп-файле содержатся изменения, которые вы хотите восстановить.
Q

Выход. Эта возможность прекращает попытку редактирования файла. Используйте её, если файл редактируется в другом Vim.

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

A Прервать. То же, что и Выход, но также прекращает выполнение всех последующих команд. Может пригодиться при загрузке сценария, который используется для редактирования нескольких файлов, например файла сеанса с несколькими окнами.
D

Удалить своп-файл. Используйте эту возможность, если вы уверены, что больше в нём не нуждаетесь. Например в тех случаях, когда в своп-файле нет актуальных изменений, или если сам файл более свежий, чем своп-файл.

На Unix этот выбор появляется только в тех случаях, когда процесс, создавший своп-файл не запущен.

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

:recover

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

Если совсем не хотите видеть это сообщение, то добавьте флаг 'A' к опции 'shortmess', хотя это было бы очень странным решением.


11.4 Дальнейшее чтение

|своп-файл| Пояснение о том, где и с каким именем создаются своп-файлы.
|:preserve| Сброс изменений в своп-файл вручную.
|:swapname| Посмотреть имя своп-файла для текущего файла.
'updatecount' Количество нажатий на клавиши, после которого изменения сбрасываются в своп-файл.
'updatetime' Время простоя, после которого изменения сбрасываются в своп-файл.
'swapsync' Должен ли диск синхронизироваться при сбросе изменений в своп-файл.
'directory' Список каталогов, в которых могут храниться своп-файлы.
'maxmem' Ограничение на использование памяти при записи текста в своп-файл.
'maxmemtot' То же, но для всех файлов.

Следующая глава: Всякие умные штучки
Авторские права: см. Авторские права