2009-05-28 21 views
52

Normalerweise verwende ich gVim zum Bearbeiten, aber manchmal verwende ich vim, wenn ich eine Verbindung zu meinem Rechner herstelle.Datei erkennen, Datei neu laden

Wenn ich eine Datei in gVim geöffnet habe und sie sich von außen geändert hat (z. B. neue Updates vom Repository), bietet gVim an, sie erneut zu laden.

Wenn so etwas mit Vim passiert, tut es nichts, bis Sie versuchen, die Datei zu speichern. Es warnt Sie nur, dass die Datei geändert wurde, bietet aber nicht an, sie erneut zu laden.

Gibt es eine Einstellung, damit Vim's Verhalten mit gVim übereinstimmt?

+0

möglich duplizieren http://stackoverflow.com/questions/2157914/can-vim-monitor-realtime- changes-to-a-file – ivotron

Antwort

23

Dies geschieht mit einem automatischen Befehl namens FileChangedShell. Ich bin zu neuen Links zu posten, aber die beste Wahl zu lesen wäre, die autocmd Teil der Vim-Dokumentation (Google für das)

aber das Wesentliche ist so etwas wie die folgende Zeile in der vimrc setzen

:au FileChangedShell * echo "Warning: File changed on disk" 
+0

Ich glaube nicht, dass das notwendig ist, vim sollte Sie automatisch über die Änderung warnen. –

+12

Obwohl es leider nicht geht. – Art

+0

Kunst, hat mein Vorschlag funktioniert? –

9

Sie können die Prüfung manuell mit :checktime auslösen. gvim tut dies jedes Mal, wenn es wieder fokussiert wird, so dass es nicht notwendig ist, die manuelle Überprüfung häufig durchzuführen.

Ich weiß nicht, ob es einen anderen Ansatz (wie automatisches Einchecken in einem bestimmten Zeitintervall) gibt.

+3

Das ist richtig, gvim macht das, aber nicht vim – Art

51

Wie ashcatch sagte, wird der :checktime Befehl nach Änderungen auf Datenträger suchen und Sie auffordern, neu zu laden. Setzen Sie Vim so, dass er nach einem Ereignis automatisch checktime ausführt. Welches Ereignis Sie verwenden, liegt ganz bei Ihnen. Eine Möglichkeit ist die Verwendung von CursorHold, die ausgelöst wird, nachdem Sie den Cursor bewegen und dann für updatetime Millisekunden still sitzen lassen. (Standard 4 Sekunden.)

:au CursorHold * checktime 

Sie könnten auch sie setzen auf WinEnter oder BufWinEnter so ändert es jedes Mal, wenn Sie zwischen den Puffern/Fenster wechseln. Wenn Sie wirklich paranoid sind, können Sie es auf CursorMoved setzen, so dass es die Datei auf der Festplatte jedes Mal überprüft, wenn Sie den Cursor bewegen, aber das ist wahrscheinlich übertrieben und kann etwas nacheilen.

Siehe :h checktime, :h updatetime, :h autocmd-events-abc.

+7

Ich bin so schlecht lesen vim Hilfe ... Ich bin mir nicht sicher, warum es mich nur aus irgendeinem Grund betäubt. – ojblass

+0

Brian, vim sagt "Keine solche Gruppe oder Veranstaltung: CursorHold * checktime" – Art

+0

Sorry, Tippfehler. CursorHold hätte Cursorhold sein sollen. –

62

Wenn Sie die aktualisierte Datei

:e 

Es sollte die geöffnete Datei neu zu laden verwenden öffnen möchten.

8

auf Carper Antwort zu verbessern:

" Run checktime in buffers, but avoiding the "Command Line" (q:) window 
au CursorHold * if getcmdwintype() == '' | checktime | endif 

Ohne diese Vim überprüfen werden Fehler Auslauf, wenn Sie versuchen, die „Command Line“ (q :) Puffer zu verwenden, da dieser Puffer nicht den :checktime Befehl unterstützt . Fand das dank kdlv auf #vim heraus.

+1

Sieht aus wie' getcmdwintype() 'kann Benötigen Sie vim 7.4? Es scheint, dass ich an 7.3 arbeite, indem ich 'getcmdtype()' stattdessen benutze. – overthink

+1

Sie können 'au CursorHold, CursorHoldI * silent! checktime' um Fehler zu ignorieren. Dies funktioniert auch in früheren Vim-Versionen. – Sameer

+1

Es ist auch schön, 'FocusGained, CursorHold' anstelle von' CursorHold' zu verwenden, um sicherzustellen, dass der Puffer sofort aktualisiert wird, nachdem er neu fokussiert wurde. – Torben

0

von diesem answer (Bezug nehmend auf eine Antwort von PhanHaiQuang und einem Kommentar von flukus)

Einer dieser oneliner von Ex laufen kann (whithin vim) bei Bedarf (oder jeden Befehl in vimrc setzen, denn wenn Log-Dateien sind geöffnet.

)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

Erläuterung:
- Autoread: liest die Datei, wenn von außen geändert (aber es funktioniert nicht auf seinem eigenen, keinen internen Timer oder so ähnlich ist es nur lesen. die Datei, wenn vim eine Aktion ausführt, wie ein Befehl in ex - CursorHold * checktime: wenn der Cursor für die in 'updatetime' angegebene Zeit (die standardmäßig 4000 Millisekunden beträgt) nicht vom Benutzer bewegt wird wird ausgeführt, der auf Änderungen außerhalb der Dateiprüft - feedkeys aufrufen ("lh"): Der Cursor wird einmal, rechts und hinten links bewegt. und dann passiert nichts (... was bedeutet, dass CursorHold getriggert ist, was bedeutet, dass wir eine Schleife haben)