Aktualizacja 2015-06-25 :
- Złomowałem metodę „powłoki”, ponieważ była ona zbyt dysfunkcyjna. Zatrzymał tryb wstawiania i opuścił procesy zombie. Spójrz na historię zmian tego postu, czy naprawdę chcesz to zobaczyć.
- Z tego zrobiłem wtyczkę: auto_autoread.vim . W tej chwili jest on faktycznie taki sam, jak poniższy kod, ale polecam korzystanie z wtyczki, ponieważ prawdopodobnie będzie otrzymywać aktualizacje.
Co ma autoread
zrobić?
Aby odpowiedzieć na to pytanie, musimy najpierw zrozumieć, co autoread
robi ta opcja, a co ważniejsze, czego nie robi.
Niestety :help 'autoread'
nie ma dużo informacji na ten temat, po prostu mówi „wykryto , że plik został zmieniony poza Vimem” . Jak Vim wykrywa zmianę pliku? W przypadku niektórych akcji Vim sprawdza czas modyfikacji pliku.
Kiedy:
:checktime
Jest używane;
- wprowadzono bufor;
:diffupdate
Jest używane;
:e
jest wydawany dla pliku, który już ma bufor;
- wykonanie polecenia zewnętrznego za pomocą
!
;
- powrót na pierwszy plan (
^Z
, fg
tylko jeśli powłoka ma kontrolę zadań);
w przypadku gVim jest to również wykonywane, gdy:
- zamykanie menu „kliknij prawym przyciskiem myszy” (albo przez wybranie czegoś, albo po prostu zamknięcie go);
- fokus został zmieniony (to już zauważyłeś);
- zamykanie okna dialogowego przeglądarki plików, które wyskakuje, jeśli użyjesz „menu -> otwórz”, „plik -> zapisz jako” z menu (a także niektórych innych miejsc).
Zebrałem te informacje ze źródła Vima, lokalizując wszystkie wywołania do
buf_check_timestamp()
, check_timestamps()
funkcji i lokalizacji, w których
need_check_timestamps
jest ustawiony TRUE
.
Mogłem przeoczyć pewne wydarzenia, ale kluczową rzeczą do zapamiętania jest to, że Vim sprawdza tylko, czy plik jest zmodyfikowany w bardzo ograniczonym zestawie okoliczności . Z pewnością nie „sonduje” pliku w poszukiwaniu zmian co n sekund, a właściwie tego właśnie szukasz.
Zatem dla twojego celu set autoread
to za mało.
Korzystanie z Pythona
Zaplanuje to uruchomienie wątku Python w tle, będzie on działał
:checktime
co n sekund. Jeśli autoread
jest włączony , spowoduje to ponowne załadowanie bufora z dysku, w przeciwnym razie po prostu ostrzeże.
Wymaga to, że Vim posiada +python
lub +python3
w :version
. Powinien działać na wszystkich platformach (w tym Windows).
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
Możesz zacząć od tego, używając :call AutoreadPython()
; oczywiście możesz to zrobić w autocmd; na przykład:
autocmd *.c call AutoreadPython()
Posłowie
W rzeczywistości jest więcej metod, na przykład możesz użyć narzędzia takiego jak
entr
Python inotify
lub gamin
moduł do monitorowania pliku pod kątem zmian, :checktime
sprawdza również wszystkie bufory, jeśli nie podano żadnych argumentów, można to poprawić, sprawdzając tylko pojedynczy bufor lub pewien plik.
Jednak ta odpowiedź jest już dość długa :-) Te metody powinny (mam nadzieję!) Działać dobrze w większości scenariuszy lub powinny być łatwe do dostosowania do twojego scenariusza.
PS. Próbowałem także użyć Ruby, ale niestety wątki Ruby (używanie Thread
) nie działają w tle tak jak Python, więc nie byłem w stanie uruchomić tego (może jest jednak inny sposób?)
CursorHold
wydarzenie? Jeśli Vim nie ma fokusa, powinien uruchamiać się co n sekund.