aktualisiere den geänderten Inhalt der in vi (m) geöffneten Datei

362

Ich habe eine Konfigurationsdatei, die ich in vim geöffnet habe, die sich jedoch manchmal auf der Festplatte ändert, ohne dass sich diese Änderungen auf dem Terminal niederschlagen. Kann ich den Inhalt auf dem Bildschirm aktualisieren, ohne die Datei zu schließen und erneut zu öffnen? Wenn das so ist, wie?

twan163
quelle
1
Verwandte Themen: Wie kann ich alle Puffer gleichzeitig neu laden? bei Vim SE
Kenorb
Zusammenfassung: Alle bisherigen Antworten lauten "Umfrage" statt "Push". Das heißt, anstatt ein externes Dateiänderungsereignis zu empfangen, wie es mit ähnlichen Funktionen anderer Software durchgeführt wurde, müssen diese Antworten darauf beruhen, dass vim die Dateiänderung entweder manuell abruft oder durch eine Benutzeraktion oder einen Zeitgeber ausgelöst. Das Endergebnis ist, dass Änderungen nicht sofort auf dem Bildschirm aktualisiert werden.
Penghe Geng

Antworten:

464

Sie können den :editBefehl verwenden, ohne einen Dateinamen anzugeben, um die aktuelle Datei neu zu laden. Wenn Sie Änderungen an der Datei vorgenommen haben, können Sie :edit!das erneute Laden der aktuellen Datei erzwingen (Sie verlieren Ihre Änderungen).

Der Befehl :editkann mit abgekürzt werden :e. Das Force-Edit kann somit per erfolgen:e!

Thushi
quelle
2
Das "!" stolperte mich, aber jetzt ist es klar.
Twan163
107
Hinweis: Dies wird normalerweise mit abgekürzt :e!.
Stéphane Chazelas
31
@StephaneChazelas: Ja, das ist richtig :) @ twan163: Anstelle von :editund :edit!kannst du auch :eund benutzen :e!.
Thushi
11
Änderungen verlieren, ja und nein. Entscheidend ist, dass Sie immer noch udie :e!.
Gerrit
5
Wenn Sie alle Puffer neu laden möchten, führen Sie außerdem :bufdo e
Folgendes aus
193

Zusätzlich zum manuellen Aktualisieren der Datei mit :editkönnen Sie sie in Ihre einfügen~/.vimrc

:set autoread

Damit aktualisiert Vim automatisch alle Dateien, die nicht von Vim bearbeitet wurden. Siehe auch :checktime.

Ingo Karkat
quelle
2
Käufer aufgepasst - Wenn Sie an neuem Code arbeiten und git pullsich dessen bewusst sind, dass Sie Ihre nicht gespeicherten Änderungen eher ungewollt auf dem Bildschirm verlieren könnten.
Azatar
5
@toszter Nein, Vim aktualisiert nur unveränderte Puffer. Bei Änderungen wird weiterhin abgefragt: Behalten oder laden?
Ingo Karkat
10
NB Autoread funktioniert nicht automatisch. Sie müssen entweder gvimexterne Befehle verwenden oder ausführen.
Sparhawk
3
Benutzer von vim in tmux können Fokusereignisse mit github.com/tmux-plugins/vim-tmux-focus-events abrufen . Andernfalls Autoread nicht im Terminal helfen , wenn Sie irgendwie nennen:checktime
Karl Bartel
3
autoreadkann X Sekunden nach dem Anhalten des Cursors automatisch ausgelöst werden (siehe diese Antwort) .
Tom Hale
57

TL; DR

Überspringen Sie die Wrap-upÜberschrift der vimrcZeilen, die hinzugefügt werden sollen, um Ihr Leben zu verbessern.

Manuell

Lauf :checktime

Überprüfen Sie, ob Puffer außerhalb von Vim ausgetauscht wurden. Dies überprüft und warnt Sie, ob Sie am Ende zwei Versionen einer Datei haben würden.

Automatisch

Um Änderungen automatisch zu laden, fügen Sie Folgendes hinzu vimrc:

set autoread

Wenn festgestellt wurde, dass eine Datei außerhalb von Vim geändert wurde und nicht innerhalb von Vim geändert wurde, lesen Sie sie automatisch erneut. Wenn die Datei gelöscht wurde, wird dies nicht durchgeführt.

Diese Antwort fügt eine Einschränkung hinzu:

Autoread lädt die Datei nicht neu, es sei denn, Sie führen einen externen Befehl (like !lsoder !shetc) aus.

Lesen Sie weiter für Lösungen.

Wird ausgelöst, wenn sich der Cursor nicht mehr bewegt

Hinzufügen zu vimrc:

au CursorHold,CursorHoldI * checktime

Standardmäßig wird CursorHold ausgelöst, nachdem der Cursor 4 Sekunden lang stillsteht , und kann über die Aktualisierungszeit konfiguriert werden .

Trigger bei Pufferwechsel oder Terminalfokus

Fügen Sie Folgendes zu Ihrem vimrcTrigger hinzu, autoreadwenn Sie die Puffer innerhalb von vim ändern :

au FocusGained,BufEnter * :checktime

Auffälliger Fokus des Terminalfensters innerhalb von Plain Vim

Um FocusGained(siehe oben) in plain vim arbeiten zu können, muss in einem Terminal-Emulator (Xterm, tmux usw.) das Plugin installiert werden: vim-tmux-focus-events

In tmux-Versionen> 1.9 müssen Sie Folgendes hinzufügen .tmux.conf:

set -g focus-events on

Einpacken

Benachrichtigungen, wenn autoreadTrigger möglich sind .

Hier sind meine vimrcZeilen, um all das zu implementieren:

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

Danke an ErichBSchulz, der mich mit in die richtige Richtung gelenkt hatau CursorHold .

Tom Hale
quelle
2
ausgezeichneter Beitrag! Fühlt sich wie eines der Dinge an, bei denen dies das Standardverhalten sein sollte
JonnyRaa