Используете постоянную отмену Vim?


96

Одна из новых функций в Vim 7.3 - «постоянная отмена», которая позволяет сохранять дерево отмены в файл при выходе из буфера.

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

Я добавил следующее в ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

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

Ноты:

  1. Я нахожусь на Win 7, использую Vim 7.3 из проекта Vim без сливок. Устойчивая отмена выполняется.

  2. $ HOME / .vim / undo существует в моей файловой системе


38
Подчеркну, пункт 2) очень важен. Vim не создаст каталог для вас, и постоянная отмена не будет работать, пока вы не сделаете этогоmkdir ~/.vim/undo
puk

2
+1. К сожалению, в Linux это работает ... спасибо, что рассказали мне об этом!
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Для будущих посетителей этого вопроса: НЕ заключайте в кавычки значение undodir! Я на какое-то время застрял на этой проблеме - используйте абсолютный paht, без кавычек.
naiveai

Ответы:


51

Поместите это в свой, .vimrcчтобы создать, undodirесли он не существует, и включить постоянную отмену. Проверено как в Windows, так и в Linux.

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
Это может быть предпочтительнее для создания каталога::silent call system('mkdir -p ' . &undodir)
Кайл Стрэнд

1
Я использую , &потому что я , а не тины его. (На мой взгляд, это различие между и является одной из многих, многих, многих ошеломляюще ужасных «особенностей» Vimscript, кроме YMMV.)setundodirletletset
Кайл Стрэнд

1
Спасибо, Кайл, это хорошая идея создать, .vimесли его не существует. К сожалению, этого -pфлага нет в Windows, поэтому я mkdirдважды редактировал ответ на вызов, чтобы обеспечить совместимость с Windows.
Маттиас Браун,

2
Ах. Моя основная причина использования -pфлага на самом деле состоит в том, чтобы избежать ошибки, когда каталог существует. У меня есть команда внутри if has('win32')блока, поэтому я просто использую mkdirбез нее -pв Windows.
Кайл Стрэнд

4
Почему бы не использовать mkdir()? Тогда это может стать:, call mkdir(myUndoDir, 'p')который ведет себя как mkdir -p.
nelstrom

8

Я пробовал это в своем _gvimrc:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

Он начал работать, как было объявлено, когда я удалил скобку try-catch, таким образом:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

Пришлось создать каталог.


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif"добавление комментированного сообщения для увеличения длины сообщения
Arelav

3

Я полагаю, $ HOME не работает так, как рекламируется.

В моей системе :echo $HOMEпоказывает H: \, но : e $HOME/говорит: ~/недопустимое имя файла.

Вы можете попробовать абсолютный путь, чтобы увидеть, вылечит ли он это


Я мог бы |: echo $ HOME | и |: e $ HOME / | без проблем, но я все равно пробовал что-то менять. Иногда казалось, что это срабатывает, а иногда - нет. В частности, он никогда не сохраняет резервные копии, когда я редактирую свой файл ~ / .vimrc.
duckworthd

На windows 7 пользуюсь $TEMP. Когда я смотрю, set undodir?это видно ~/AppData/Local/Temp. Файл отмены сохраняется и загружается правильно. Может $TEMPнадежнее будет?
slawek

1

Теперь это работает так, как ожидалось: file.txtоткройте в буфере Vim 7.4 в Windows 7, :setlocal undofileзатем сохраните изменения в буфере, и вместе с ним .file.txt.un~будет создан файл отмены , поскольку он :set undodir?сообщает, что "undodir =." по умолчанию - т.е. указывать это вручную не нужно. Вы также можете :set undofileв моделине.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.