Używasz trwałego cofania Vima?


96

Jedną z nowych funkcji w Vim 7.3 jest „trwałe cofnięcie”, które pozwala na zapisanie undotree do pliku przy wychodzeniu z bufora.

Niestety, nie udało mi się prawidłowo go włączyć lub chyba źle go używam. Oto, czego próbowałem do tej pory:

Dodałem do ~ / .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

Po tym powinienem być w stanie otworzyć dowolny plik, edytować go, a następnie zapisać i zamknąć, a kiedy ponownie go otworzę, powinienem być w stanie cofnąć / powtórzyć, jakbym nigdy nie wyszedł. Niestety, wydaje się, że tak nie jest, ponieważ żaden plik undofile nigdy nie jest zapisywany.

Uwagi:

  1. Jestem na Win 7 i używam Vima 7.3 z projektu Vim without cream. Trwałe cofanie jest wbudowane.

  2. $ HOME / .vim / undo istnieje w moim systemie plików


38
Dla podkreślenia, punkt 2) jest bardzo ważny. Vim nie utworzy katalogu dla ciebie, a trwałe cofanie nie zadziała, dopóki niemkdir ~/.vim/undo
puk

2
+1. Przepraszam, w Linuksie to działa ... dzięki za poinformowanie mnie o tym!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Dla przyszłych odwiedzających to pytanie: NIE umieszczaj cudzysłowu wokół wartości undodir! Utknąłem na tym problemie na chwilę - użyj absolutnego pahta, bez cudzysłowów.
naiveai

Odpowiedzi:


51

Umieść to w swoim, .vimrcaby utworzyć, undodirjeśli nie istnieje, i włącz trwałe cofanie. Przetestowano na Windowsie i Linuksie.

" 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
Może to być preferowane przy tworzeniu katalogu::silent call system('mkdir -p ' . &undodir)
Kyle Strand

1
Używam &bo zamiast ting nim. (Moim zdaniem to rozróżnienie między i jest jedną z wielu, wielu, wielu zadziwiająco okropnych "cech" Vimscript, ale YMMV.)setundodirletletset
Kyle Strand

1
Dzięki Kyle, to dobry pomysł, .vimjeśli coś takiego nie istnieje. Niestety -pflaga nie istnieje w systemie Windows, więc mkdirdwukrotnie poprawiłem odpowiedź, aby zadzwonić, aby zapewnić zgodność z systemem Windows.
Matthias Braun

2
Ach. Moim głównym powodem używania -pflagi jest w rzeczywistości uniknięcie błędu, gdy katalog istnieje. Mam polecenie wewnątrz if has('win32')bloku, więc po prostu używać mkdirbez -psystemu Windows.
Kyle Strand

4
Dlaczego nie używać mkdir()? Wtedy może się to stać call mkdir(myUndoDir, 'p'):, które zachowuje się jak mkdir -p.
nelstrom

8

Próbowałem tego w moim _gvimrc:

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

Zaczęło działać zgodnie z reklamą, kiedy usunąłem nawias try-catch, w ten sposób:

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

Musiałem stworzyć katalog.


if has('persistent_undo')
Arelav,

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

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

1
endif"dodanie komentowanej wiadomości w celu zwiększenia długości wiadomości
Arelav

3

Przypuszczam, że $ HOME nie działa zgodnie z reklamą.

W moim systemie :echo $HOMEpokazuje H: \, ale : e $HOME/mówi: ~/nieprawidłowa nazwa pliku.

Możesz spróbować absolutną ścieżką, aby zobaczyć, czy to wyleczy


Mógłbym |: echo $ HOME | i |: e $ HOME / | bez problemów, ale i tak próbowałem coś zmienić. Czasami wydawało się działać, a czasami nie. W szczególności, nigdy nie zapisuje kopii zapasowych, gdy edytuję mój plik ~ / .vimrc.
duckworthd

W systemie Windows 7 używam $TEMP. Kiedy patrzę, set undodir?to widać ~/AppData/Local/Temp. Plik cofania jest utrwalany i ładuje się poprawnie. Może $TEMPbędzie bardziej niezawodny?
slawek

1

Teraz działa to zgodnie z oczekiwaniami: file.txtotwórz w buforze Vima 7.4 w systemie Windows 7, :setlocal undofilea następnie zapisz zmianę w buforze, a plik undofile .file.txt.un~zostanie utworzony obok, ponieważ :set undodir?zgłasza „undodir =”. domyślnie - tzn. nie ma potrzeby określania tego ręcznie. Możesz także :set undofilew modelinie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.