Używam VIm do wszelkiego rodzaju rzeczy (w tym przypadku gVim), w tym monitorowania wyników zapisanych do pliku; Używam, autoread
aby Vim ponownie czytał plik, co dzieje się za każdym razem, gdy przełączam na niego fokus klawiatury.
Czy jest jakiś sposób, aby Vim zaktualizował bufor, nawet jeśli nie przełączę fokusu na klawiaturze? Próbowałem ustawienia, checktime
ale wydaje się, że nie ma to żadnego wpływu, gdy klawiatura jest gdzie indziej.
Dane wyjściowe, które monitoruję, całkowicie zastępują plik wyjściowy; i nie patrzę na tail -f
to. Istnieją inne opcje, takie jak przesyłanie do nowej instancji za każdym razem, przesyłanie do less
lub coś w tym stylu, ale byłoby fajnie, gdyby można to zrobić za pomocą VIm.
filesystem
falstro
źródło
źródło
CursorHold
wydarzenie? Jeśli Vim nie ma fokusa, powinien uruchamiać się co n sekund.CursorHold
jest wykonywany tylko raz, jest to wyraźnie udokumentowane jako: „nie odpala każdego ms aktualizacji, jeśli zostawisz Vima na kawę. :)”Odpowiedzi:
Aktualizacja 2015-06-25 :
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;:diffupdate
Jest używane;:e
jest wydawany dla pliku, który już ma bufor;!
;^Z
,fg
tylko jeśli powłoka ma kontrolę zadań);w przypadku gVim jest to również wykonywane, gdy:
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órychneed_check_timestamps
jest ustawionyTRUE
.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śliautoread
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).Możesz zacząć od tego, używając
:call AutoreadPython()
; oczywiście możesz to zrobić w autocmd; na przykład:Posłowie
W rzeczywistości jest więcej metod, na przykład możesz użyć narzędzia takiego jak
entr
Pythoninotify
lubgamin
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?)źródło
Zrobiłem małą wtyczkę vim-autoread, która wykorzystuje
tail -f
asynchronicznie aktualizację bufora w tle. To oczywiście wymaga funkcji zadania Vima w wersji 8.Użyj,
:AutoRead
aby włączyć i:AutoRead!
wyłączyć.źródło
W Neovim możesz użyć następującego polecenia, które otworzy bufor terminala z uruchomionym poleceniem tail.
Będzie to nadal działać, nawet jeśli plik zostanie usunięty i ponownie utworzony.
Lub dodaj następujące elementy do swojego
$MYVIMRC
źródło
z tej odpowiedzi (odnosząc się do odpowiedzi PhanHaiQuang i komentarza flukus )
Można uruchomić ten oneliner z ex (whithin vim) w razie potrzeby (lub umieścić każde polecenie w vimrc, na wypadek, gdy pliki dziennika są otwarte).
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Objaśnienie:
- autoread : czyta plik po zmianie z zewnątrz (ale nie działa samodzielnie, nie ma wewnętrznego timera ani czegoś takiego. Odczyta plik tylko wtedy, gdy vim wykona akcję, jak polecenie w ex
:!
- CursorHold * checktime : gdy kursor nie zostanie przesunięty przez użytkownika na czas określony w „updatetime” (domyślnie jest to 4000 milisekund), wykonywany jest checktime, który sprawdza zmiany spoza pliku
- wywołuje klawisze feed ((lh)) : kursor przesuwa się raz, w prawo i wstecz w lewo. i wtedy nic się nie dzieje (... co oznacza, że uruchamiane jest CursorHold, co oznacza, że mamy pętlę )
źródło