Update 25.06.2015 :
- Ich habe die "Shell" -Methode abgeschafft, da sie zu dysfunktional war. Der Einfügemodus wurde beendet und die Zombie-Prozesse wurden beendet. Wenn Sie sich den Revisionsverlauf dieses Posts ansehen, möchten Sie ihn auf jeden Fall sehen.
- Ich habe ein Plugin daraus gemacht: auto_autoread.vim . Im Moment ist es praktisch dasselbe wie der folgende Code, aber ich würde empfehlen, dass Sie das Plugin verwenden, da dies wahrscheinlich Updates erhalten wird.
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;
- ein Puffer wird eingegeben;
:diffupdate
wird genutzt;
:e
wird für eine Datei ausgegeben, die bereits einen Puffer hat;
- Ausführen eines externen Befehls mit
!
;
- Rückkehr in den Vordergrund (
^Z
, fg
nur wenn die Shell die Job-Kontrolle hat);
Für gVim ist dies auch dann der Fall, wenn:
- Schließen des "Rechtsklick" -Menüs (entweder durch Auswahl oder durch einfaches Schließen);
- der Fokus wird geändert (das ist Ihnen bereits aufgefallen);
- Schließen des Dateibrowser-Dialogfelds, das angezeigt wird, wenn Sie "Datei -> Öffnen", "Datei -> Speichern unter" im Menü (sowie an einigen anderen Stellen) verwenden.
Ich habe diese Informationen aus der Vim-Quelle gesammelt, indem ich alle Aufrufe von buf_check_timestamp()
, check_timestamps()
Funktionen und Speicherorte, auf die eingestellt
need_check_timestamps
ist, lokalisiert habe
TRUE
.
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. Wenn autoread
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.
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
Sie können dies mit starten :call AutoreadPython()
; Sie können dies natürlich in einem Autocmd tun; beispielsweise:
autocmd *.c call AutoreadPython()
Nachwort
Es gibt tatsächlich mehr Methoden, zum Beispiel könnten Sie ein Tool wie
entr
oder Python inotify
oder ein gamin
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?)
CursorHold
Veranstaltung? Wenn Vim nicht fokussiert ist, sollte es alle n Sekunden ausgelöst werden.