2011-08-09 12 views
22

Nie chcę wiedzieć, dlaczego nie powinieneś automatycznie zapisywać plików, plików wymiany itp. Ani żadnych innych powodów, dla których nie chcesz automatycznie zapisywać.Jak automatycznie zapisywać plik co 1 sekundę w vimie?

Po prostu chcę automatycznie zapisać bieżący plik roboczy, aby zapisać co 1 sekundę w vimie.

Jak mogę to osiągnąć?

Odpowiedz

9

Po uruchomieniu odczyt z pliku, należy ustawić zmienną bufora do chwili obecnej:

au BufRead,BufNewFile * let b:save_time = localtime() 

Ustaw imprezę, aby sprawdzić, czy na tyle czasu upłynęło od ostatniego zapisu i zmiana, jeśli nie:

au CursorHold * call UpdateFile() 

Ustaw okres auto-save, w sekundach:

let g:autosave_time = 1 

zdefiniować funkcję, aby zapisać plik, jeśli nee ded:

" save if needed/update the save_time after the save 
function! UpdateFile() 
    if((localtime() - b:save_time) >= g:autosave_time) 
     update 
     let b:save_time = localtime() 
    else 
     " just debugging info 
     echo "[+] ". (localtime() - b:save_time) ." seconds have elapsed so far." 
    endif 
endfunction 

Następnie, aby wyzerować czas zapisać explicite:

au BufWritePre * let b:save_time = localtime() 

nie testowałem powyższe na vim 7.0 i nowszym. Ponadto, zdarzenie CursorHold jest mało prawdopodobne, aby wystarczyło na tak mały czas automatycznego zapisywania (nie powoduje to również uruchomienia podczas nagrywania) - może powinieneś również zadzwonić pod numer UpdateFile() również na CursorMoved.

Należy również rozważyć użycie plików wymiany. Domyślnie plik wymiany jest zapisywany po wpisaniu 200 znaków lub 4 sekund bezczynności. Odzyskiwanie z wymiany jest dość proste i może bardziej niezawodne, na wypadek gdyby coś poszło nie tak.

+3

Wygląda na to, że ta funkcja jest już zaplanowana dla następnych wersji Vima (na Vimie 7.3 ': help autosave' wyświetla się z' todo.txt'). Na chwilę obecną uważam, że nie ma odpowiedniego autocmd/zdarzenia, aby napisać vimscript, aby wykonać save za każdą sekundę. Ale rozwiązanie zaproponowane przez Michaela powinno działać w większości przypadków, ponieważ nawet jeśli nie wykonuje zapisów, gdy kursor nie jest przesuwany, nie jest bardzo prawdopodobne, że wykonasz jakiekolwiek zmiany bez przesuwania kursora. – mMontu

+0

http://vim.wikia.com/wiki/Auto-save_current_buffer_periodically –

+2

W wersji 7.4, wbudowana funkcja autozapisu jest nadal wymieniona pod ulepszeniami, które zostaną dodane w przyszłych wersjach. –

23

To zapisuje bufor po każdej zmianie tekstu. (Vim 7,4)

autocmd TextChanged,TextChangedI <buffer> silent write

+1

Kciuk w górę dla elegancji i prostoty! Pracował jak bryza! [Należy umieścić to w jego '_vimrc'.] – llinfeng

1

Wtyczka vim-workspace ma dość konfigurowalny auto-save funkcja, która może w zależności od potrzeb (z AutoRead więc masz ostatni pisarz wygrywa zachowania). Można ustawić zawsze automatyczne zapisywanie (domyślnie tylko autozapisywanie w sesji obszaru roboczego) i odpowiednio ustawić czas aktualizacji.

let g:workspace_autosave_always = 1 
updatetime=1000