Ist es möglich, dass Vim Dateien automatisch speichert?

32

Einige Textverarbeitungsprogramme und Texteditoren speichern die Dateien, die wir von Zeit zu Zeit bearbeiten, automatisch, was sehr praktisch ist, um böse Abstürze usw. zu überstehen.

Gibt es eine Möglichkeit, dass Vim unsere Dateien nach einem bestimmten Intervall automatisch speichert?

Thameera
quelle

Antworten:

30

Es gibt keine eingebaute Option, obwohl :help 'autosave'(in todo.txt) auf eine Beschreibung verweist, was eine solche Option tun könnte.

Eine Möglichkeit, dies zu implementieren, ist die Verwendung des CursorHoldEreignisses autocommand. Dieses Ereignis wird ausgelöst, wenn der Benutzer seit 'updatetime'Millisekunden keine Taste gedrückt hat .

autocmd CursorHold * update

Der :updateBefehl speichert den Puffer nur, wenn er geändert wird. Wenn dies auch im aktiven Einfügemodus geschehen soll, CursorHoldIkann dies zur Ereignisliste hinzugefügt werden.

autocmd CursorHold,CursorHoldI * update

Eine weitere Alternative ist die 'autowrite'Option, mit der der Puffer gespeichert wird, bevor ein externer Befehl ausgeführt wird (nützlich zum Speichern vor dem Ausführen :make) oder auf einen anderen Puffer umgeschaltet wird.

Jamessan
quelle
Wie können Sie feststellen, ob es funktioniert?
Nilon
@nilon Es sollte in der Statusleiste gedruckt werden, in der es gespeichert ist, als ob Sie Folgendes gedrückt hätten: w Sie selbst.
MaudPieTheRocktorate
12

Vim verfügt zwar über eine automatische Speicherfunktion, speichert diese jedoch in der Wiederherstellungsdatei.

Wenn Sie ein Dokument bearbeiten, erstellt z. B. MyFile.txtvim die Revovery-Datei .MyFile.txt.swp. Wenn Ihr System abstürzt oder Ihre Sitzung abstürzt, können Sie die Verbindung wiederherstellen, indem Sie Folgendes eingeben:

vim -r MyFile.txt

Dadurch wird die Datei zur Bearbeitung geöffnet und die zuletzt vorgenommenen Änderungen werden wiederhergestellt.

Sie können die wiederhergestellte Version dann wie gewohnt speichern :w.

Wenn Sie vim beenden, wird es leider die .MyFile.txt.swpUmgebung verlassen und Sie müssen es manuell entfernen:

rm .MyFile.txt.swp

Siehe „Recovery“ Man Seite auch Kapitel 11

rolfl
quelle
1
Wenn Sie Vim ordnungsgemäß beenden (z. B. mit :wqoder :q!oder ZZoder usw.), sollten Auslagerungsdateien automatisch entfernt werden.
Türknauf
4
@ Doorknob nicht, wenn Sie nach einer Wiederherstellung
beenden
8

Ich habe ein Plugin vim-autosave erstellt, das die Vim 8-Funktion von Timern verwendet, um Ihre Puffer regelmäßig zu speichern.

Christian Brabandt
quelle
Woah, Vim 8 Plugins kommen schon raus. Sieht gut aus, Christian!
Thameera
Danke, Christian. Das sieht vielversprechend aus. Ich frage mich, ob das Plugin neue / nicht gespeicherte Dateien unterstützt. Ich kann die Antwort in der Plugin-Dokumentation nicht finden. Mein Computer hat sich gestern Abend für einen Neustart entschieden und ich hatte einige kurze Notizen zu neuen Puffern. Vim hat keine swp-Dateien erstellt oder gespeichert.
JAponte
Nein, derzeit werden keine neuen / nicht gespeicherten Dateien unterstützt. Wenn du das willst, mache weiter und erstelle ein lustiges Problem.
Christian Brabandt
2

Ich lasse meinen Vim jedes Mal alles speichern, wenn der Fokus verloren geht.

autocmd FocusLost <your-patterns-here> silent! wall

Meine Muster sind ziemlich lang und ich benutze sie in mehreren AutocMDS, aber der Vollständigkeit halber sieht es so aus:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END
Dash-Tom-Bang
quelle
1

Wie andere angegeben haben, verfügt vim über eine Auslagerungsdatei (.swp), die an der Stelle erstellt wird, an der sich Ihre ursprüngliche Datei befindet. In Ihrer .vimrc-Datei können Sie jedoch das .swp-Verzeichnis festlegen.

Sie müssen das Verzeichnis mit erstellen mkdirund dann Ihre .vimrc auf diesen Speicherort einstellen.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp
registrierter Nutzer
quelle
1

Das vim-workspace- Plugin verfügt über eine anpassbare Funktion zum automatischen Speichern, die möglicherweise Ihren Anforderungen entspricht. Standardmäßig wird das automatische Speichern in einer Arbeitsbereichssitzung (Hauptfunktion) aktiviert. Sie können es jedoch so einstellen, dass es immer automatisch gespeichert wird, wenn Sie nur danach suchen ( let g:workspace_autosave_always = 1).

Jaybay
quelle
1

Versuchen Sie, den Puffer zu speichern, wenn sich der Text ändert:

autocmd TextChanged,TextChangedI <buffer> silent write

Das funktioniert bei mir.

Quelle

simhumileco
quelle