Ich verwende VIm für alle Arten von Dingen (oder in diesem Fall für gVim), einschließlich der Überwachung der in eine Datei geschriebenen Ausgabe. Ich autoread
veranlasse Vim, die Datei erneut zu lesen, was immer dann der Fall ist, wenn ich den Tastaturfokus darauf lege.
Gibt es eine Möglichkeit, Vim den Puffer aktualisieren zu lassen, auch wenn ich den Tastaturfokus nicht ändere? Ich habe versucht, Einstellungen vorzunehmen, checktime
aber es scheint keinen Effekt zu haben, wenn der Tastaturfokus an einer anderen Stelle liegt.
Die von mir überwachte Ausgabe ersetzt die Ausgabedatei vollständig. und ich freue mich nicht tail -f
darauf. Es gibt noch andere Möglichkeiten, wie zum Beispiel, jedes Mal in eine neue Instanz zu leiten oder in less
etwas, aber es wäre cool, wenn es mit VIm gemacht werden könnte.
quelle
CursorHold
Veranstaltung? Wenn Vim nicht fokussiert ist, sollte es alle n Sekunden ausgelöst werden.CursorHold
wird nur einmal ausgeführt. Dies ist explizit dokumentiert als: "Feuert nicht jede 'Aktualisierungszeit' ms ab, wenn Sie Vim verlassen, um Kaffee zuAntworten:
Update 25.06.2015 :
Was macht
autoread
das?Um diese Frage zu beantworten, müssen wir zuerst verstehen, was die
autoread
Option bewirkt und was sie noch wichtiger macht .Leider
:help 'autoread'
gibt es nicht viele Informationen dazu, sondern nur die Meldung "Es wurde festgestellt, dass eine Datei außerhalb von Vim geändert wurde" . Wie erkennt Vim, dass eine Datei geändert wurde? Bei bestimmten Aktionen überprüft Vim die Änderungszeit der Datei.Wann:
:checktime
wird genutzt;:diffupdate
wird genutzt;:e
wird für eine Datei ausgegeben, die bereits einen Puffer hat;!
;^Z
,fg
nur wenn die Shell die Job-Kontrolle hat);Für gVim ist dies auch dann der Fall, wenn:
Ich habe diese Informationen aus der Vim-Quelle gesammelt, indem ich alle Aufrufe von
buf_check_timestamp()
,check_timestamps()
Funktionen und Speicherorte, auf die eingestelltneed_check_timestamps
ist, lokalisiert habeTRUE
.Möglicherweise habe ich einige Ereignisse verpasst, aber das Wichtigste ist, dass Vim nur überprüft, ob die Datei unter bestimmten Umständen geändert wurde . Es "fragt" die Datei sicher nicht n Sekunden lang nach Änderungen ab , was im Grunde das ist, wonach Sie suchen.
Für Ihren Zweck
set autoread
ist das also nicht genug.Verwenden von Python
Dadurch wird ein Python-Thread im Hintergrund ausgeführt, der
:checktime
alle n Sekunden ausgeführt wird. Wennautoread
wird aktiviert , wird dies den Puffer von der Festplatte neu zu laden, sonst wird es nur warnen.Dies setzt voraus, dass Vim
+python
oder+python3
in hat:version
. Es sollte auf allen Plattformen (einschließlich Windows) funktionieren.Sie können dies mit starten
:call AutoreadPython()
; Sie können dies natürlich in einem Autocmd tun; beispielsweise:Nachwort
Es gibt tatsächlich mehr Methoden, zum Beispiel könnten Sie ein Tool wie
entr
oder Pythoninotify
oder eingamin
Modul verwenden, um eine Datei auf Änderungen zu überwachen.:checktime
Außerdem werden alle Puffer überprüft, wenn keine Argumente angegeben wurden. Dies kann durch Überprüfen nur eines einzelnen Puffers oder verbessert werden eine bestimmte Datei.Diese Antwort ist jedoch schon ziemlich lang :-) Diese Methode sollte (hoffentlich!) Für die meisten Szenarien gut funktionieren oder sollte leicht an Ihr Szenario anpassbar sein.
PS. Ich habe auch versucht, Ruby zu verwenden, aber leider
Thread
laufen Ruby-Threads (mit ) nicht im Hintergrund wie Python, so dass ich nicht in der Lage war, dies zum Laufen zu bringen (vielleicht gibt es aber einen anderen Weg?)quelle
Ich habe ein kleines Plugin vim-autoread erstellt , mit
tail -f
dem der Puffer im Hintergrund asynchron aktualisiert wird. Dies erfordert natürlich die Job-Funktion von Vim Version 8.Verwenden Sie,
:AutoRead
um es einzuschalten und um:AutoRead!
es auszuschalten.quelle
In Neovim können Sie den folgenden Befehl verwenden, der einen Terminalpuffer öffnet, in dem der Befehl tail ausgeführt wird.
Dies funktioniert auch dann weiter, wenn die Datei entfernt und neu erstellt wird.
Oder fügen Sie Folgendes zu Ihrer hinzu
$MYVIMRC
quelle
Aus dieser Antwort (unter Bezugnahme auf eine Antwort von PhanHaiQuang und einen Kommentar von Flukus )
Dieser Oneliner kann bei Bedarf von ex (innerhalb von vim) ausgeführt werden (oder jeder Befehl in vimrc abgelegt werden, wenn Protokolldateien geöffnet werden.)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Erklärung:
- autoread : Liest die Datei, wenn sie von außen geändert wird (aber es funktioniert nicht von alleine, es gibt keinen internen Timer oder ähnliches. Es liest die Datei nur, wenn vim eine Aktion ausführt, wie ein Befehl in ex
:!
- CursorHold * checktime : Wenn der Cursor für die in 'updatetime' angegebene Zeit (standardmäßig 4000 Millisekunden) nicht vom Benutzer bewegt wird, wird checktime ausgeführt, um nach Änderungen von außerhalb der Datei zu suchen
- Feedkeys aufrufen ("lh") : Der Cursor wird einmal nach rechts und hinten nach links bewegt und dann passiert nichts (... was bedeutet, dass CursorHold ausgelöst wird, was bedeutet, dass wir eine Schleife haben )
quelle