Czy jest możliwe, aby Vim automatycznie zapisywał pliki?


32

Niektóre edytory tekstu i edytory tekstu automatycznie zapisują pliki, które edytujemy od czasu do czasu, co jest bardzo wygodne w przypadku przetrwania po paskudnych awariach itp.

Czy istnieje sposób, aby Vim automatycznie zapisywał nasze pliki po określonym czasie?

Odpowiedzi:


30

Nie ma wbudowanej opcji, chociaż :help 'autosave'(w todo.txt) odnosi się do opisu tego, co taka opcja mogłaby zrobić.

Jednym z możliwych sposobów realizacji tego jest użycie CursorHoldzdarzenia autocommand. To zdarzenie jest wyzwalane, gdy użytkownik nie naciska klawisza przez 'updatetime'milisekundy.

autocmd CursorHold * update

:updateKomenda zapisuje tylko bufor, jeśli jest on modyfikowany. Jeśli chcesz, aby tak się stało, gdy tryb wstawiania jest aktywny, CursorHoldImożna go dodać do listy zdarzeń.

autocmd CursorHold,CursorHoldI * update

Inną alternatywą jest 'autowrite'opcja, która zapisze bufor przed wykonaniem zewnętrznego polecenia (przydatne do zapisania przed uruchomieniem :make) lub przełączeniem na inny bufor.


Jak możesz zauważyć, czy to działa?
nilon

@nilon Powinien on wypisać na pasku stanu, że jest zapisany, tak jakbyś sam nacisnął: w.
MaudPieTheRocktorate

12

Vim ma funkcję automatycznego zapisywania, ale zapisuje go w pliku „odzyskiwania”.

Podczas edycji dokumentu, np. MyFile.txtVim utworzy plik odnawiania .MyFile.txt.swp. Jeśli Twój system ulegnie awarii lub sesja umrze, możesz ponownie połączyć się i odzyskać dane z miejsca, w którym zostało przerwane, wpisując:

vim -r MyFile.txt

Spowoduje to otwarcie pliku do edycji i przywrócenie ostatnich wprowadzonych zmian.

Następnie możesz zapisać odzyskaną wersję w normalny sposób :w.

Niestety, kiedy wyjdziesz z vima, opuści on wszystko .MyFile.txt.swpi musisz go usunąć ręcznie:

rm .MyFile.txt.swp

Patrz „Odzyskiwanie” człowiek stronę też rozdział 11


1
Po prawidłowym wyjściu z Vima (tj. Przy pomocy :wqlub :q!lub ZZlub itp.) Pliki wymiany powinny zostać automatycznie usunięte.
Klamka

4
@Doorknob nie, gdy wychodzisz po powrocie do zdrowia ... ;-)
rolfl

8

Zrobiłem wtyczkę vim-autosave, która używa funkcji Vim 8 Timerów do okresowego zapisywania twoich buforów.


Woah, wtyczki Vim 8 już wychodzą. Wygląda świetnie, Christian!
thameera

Dzięki, Christian. To wygląda obiecująco. Zastanawiam się, czy wtyczka obsługuje nowe / niezapisane pliki. Nie mogę znaleźć odpowiedzi w dokumentacji wtyczki. Mój komputer postanowił zrestartować wczoraj wieczorem i miałem kilka krótkich notatek na temat nowych buforów. Vim nie utworzył ani nie zachował plików SWP.
JAponte

Nie, obecnie nie obsługuje nowych / niezapisanych plików. Jeśli chcesz, idź dalej i stwórz podejrzany problem.
Christian Brabandt

2

Sprawiam, że mój Vim zapisuje wszystko za każdym razem, gdy stracisz koncentrację.

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

Moje wzory są dość długie i używam ich w kilku autocmds, ale dla kompletności wygląda to tak:

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

1

Jak wskazali inni, vim ma plik wymiany (.swp), który zostanie utworzony w dowolnym miejscu, w którym znajduje się oryginalny plik, ale w pliku .vimrc możesz ustawić katalog .swp.

Musisz utworzyć katalog za pomocą, mkdira następnie ustawić .vimrc w tej lokalizacji.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

1

Vim-roboczy Wtyczka ma dość konfigurowalny auto-save funkcji, które mogą zależności od potrzeb. Domyślnie włącza automatyczne zapisywanie w sesji obszaru roboczego (jego główna funkcja), ale możesz ustawić, aby zawsze zapisywało automatycznie, jeśli tylko tego szukasz ( let g:workspace_autosave_always = 1).


1

Spróbuj zapisać bufor przy każdej zmianie tekstu:

autocmd TextChanged,TextChangedI <buffer> silent write

To działa dla mnie.

Źródło

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.