Verwenden Sie das dauerhafte Rückgängigmachen von Vim?

96

Eine der neuen Funktionen in Vim 7.3 ist das permanente Rückgängigmachen, mit dem der Undotree beim Beenden eines Puffers in einer Datei gespeichert werden kann.

Leider konnte ich es nicht richtig aktivieren, oder ich muss es falsch verwenden. Folgendes habe ich bisher versucht:

Ich habe Folgendes zu ~ / .vimrc hinzugefügt

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

Danach sollte ich angeblich in der Lage sein, jede Datei zu öffnen, zu bearbeiten und dann zu speichern und zu schließen. Wenn ich sie erneut öffne, sollte ich sie rückgängig machen / wiederholen können, als wäre ich nie gegangen. Leider scheint dies nicht der Fall zu sein, da niemals eine Undofile geschrieben wird.

Anmerkungen:

  1. Ich bin auf Win 7 mit Vim 7.3 aus dem Vim ohne Creme-Projekt. Anhaltendes Rückgängigmachen ist eingebrannt.

  2. $ HOME / .vim / undo ist in meinem Dateisystem vorhanden

duckworthd
quelle
38
Nur um zu betonen, ist Punkt 2) sehr wichtig. Vim wird das Verzeichnis nicht für Sie erstellen und dauerhaftes Rückgängigmachen wird nicht funktionieren, bis Siemkdir ~/.vim/undo
puk
2
+1. Sorry, unter Linux funktioniert es ... danke, dass du mir davon erzählt hast!
Ciro Santilli 法轮功 冠状 病 六四 事件 20
Für zukünftige Besucher dieser Frage: Setzen Sie KEINE Anführungszeichen um den Wert von Undodir! Ich habe mich eine Weile mit diesem Problem beschäftigt - benutze ein absolutes Paht ohne Anführungszeichen.
naiveai

Antworten:

51

Fügen Sie dies in Ihre ein .vimrc, um eine zu erstellen, undodirfalls diese nicht vorhanden ist, und aktivieren Sie das dauerhafte Rückgängigmachen. Getestet unter Windows und 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
Matthias Braun
quelle
5
Dies kann für die Erstellung des Verzeichnisses vorzuziehen sein::silent call system('mkdir -p ' . &undodir)
Kyle Strand
1
Ich benutze, &weil ich setdas undodireher als letting es. (In meinen Augen ist diese Unterscheidung zwischen letund seteines der vielen, vielen, vielen umwerfend schrecklichen "Merkmale" von Vimscript, aber YMMV.)
Kyle Strand
1
Danke Kyle, es ist eine gute Idee zu erstellen, .vimwenn es nicht existiert. Leider ist das -pFlag unter Windows nicht vorhanden, daher habe ich die Antwort so bearbeitet, dass sie mkdirzweimal aufgerufen wird, um die Windows-Kompatibilität sicherzustellen.
Matthias Braun
2
Ah. Mein Hauptgrund für die Verwendung des -pFlags besteht darin, einen Fehler zu vermeiden, wenn das Verzeichnis vorhanden ist. Ich habe meinen Befehl in einem if has('win32')Block, so dass ich nur mkdirohne -pauf Windows.
Kyle Strand
4
Warum nicht verwenden mkdir()? Dann kann dies werden : call mkdir(myUndoDir, 'p'), was sich so verhält mkdir -p.
Nelstrom
8

Ich habe dies in meinem _gvimrc versucht:

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

Es begann wie angekündigt zu funktionieren, als ich die Try-Catch-Klammer löschte, also:

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

Ich musste das Verzeichnis erstellen.

Juan Lanus
quelle
if has('persistent_undo')
Arelav
silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav
set undodir=~/.config/nvim/backups
Arelav
1
endif"Hinzufügen einer kommentierten Nachricht zur Erhöhung der Nachrichtenlänge
Arelav
3

Ich nehme an, $ HOME funktioniert nicht wie angekündigt.

:echo $HOMEZeigt auf meinem System H: \ an, : e $HOME/sagt aber : ~/ungültiger Dateiname.

Sie könnten mit einem absoluten Pfad versuchen, um zu sehen, ob es es heilt

sehe sehen
quelle
Ich könnte |: echo $ HOME | und |: e $ HOME / | ohne Probleme, aber ich habe trotzdem versucht, Dinge zu ändern. Es schien manchmal zu funktionieren und nicht bei anderen. Insbesondere werden beim Bearbeiten meiner ~ / .vimrc-Datei niemals Backups gespeichert.
duckworthd
Unter Windows 7 verwende ich $TEMP. Wenn ich schaue set undodir?, zeigt es ~/AppData/Local/Temp. Datei rückgängig machen bleibt bestehen und lädt sich korrekt. Vielleicht $TEMPwird zuverlässiger?
Slawek
1

Dies funktioniert jetzt wie erwartet: file.txtÖffnen Sie es in einem Vim 7.4-Puffer unter Windows 7, :setlocal undofilespeichern Sie dann eine Änderung am Puffer, und die Undofile .file.txt.un~wird nebenbei erstellt, da :set undodir?"undodir =" gemeldet wird. Standardmäßig - dh dies muss nicht manuell angegeben werden. Sie können auch :set undofilein einem Modeline.

JosephHarriott
quelle