Как я могу использовать Undofile?

36

В последнем новостном сообщении на vim.org говорится об использовании «undofile» для сохранения вашей истории и отмены изменений даже после перезагрузки:

Как я узнал на прошлых выходных, функция, которой я наслаждаюсь сам, не известна многим пользователям. Помимо отмены со стольким количеством уровней, сколько вам нужно, Vim также предлагает сохранить информацию об отмене в файле. Таким образом, вы можете выйти из Vim, перезагрузить компьютер и при этом отменить сделанные вами изменения. Смотрите справку для «отменить». (Брэм Муленаар)

Как я могу включить и использовать эту функцию?

Отменить
источник
2
Брэм, вероятно, говорил об этом событии
Курт Пфайфл

Ответы:

37

Самая простая версия: создайте ~/.vim/undo-dir/каталог и добавьте следующее .vimrc:

set undodir=~/.vim/undo-dir
set undofile

Тем не менее, это не безупречно, и лучше читать дальше. Из моего собственного .vimrc:

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

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

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

Наконец, не являясь системным временным каталогом, на него не распространяется политика очистки системного временного файла. Часто это довольно коротко - около недели. Но чтобы это не росло вечно, я добавляю следующее crontab:

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

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

derobert
источник
Спасибо за подробный ответ @derobert! Я знаю, что это старый вопрос, но я пытался придумать vimscript способ удаления старых файлов vim undo ( vi.stackexchange.com/questions/16053/… ). Я думаю, что так будет чище, но это будет нелегко. Вы когда-нибудь задумывались об использовании vimscript для удаления старых файлов vim? Если нет, вы бы все еще использовали crontab вместо vimscript?
Логан,
1
@Logan Использование сценария vim будет работать только во время работы vim, а также, что если работает несколько vims? Эта линия cron проста, не страдает от этих проблем и, безусловно, правильна ...
Дероберт,
Кажется, что mkdir()функция поддерживает создание нескольких структур каталогов с "p"опцией для {path}параметра. Таким образом, приведенный выше скрипт можно немного упростить. Использование call mkdir($HOME."/.vim/undo-dir", "p", 0700)работает для меня в Vim 7.4.160 по крайней мере.
25