it-swarm.com.de

Aktualisieren Sie den geänderten Inhalt der in vi (m) geöffneten Datei.

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

379
twan163

Sie können den Befehl :edit Verwenden, ohne einen Dateinamen anzugeben, um die aktuelle Datei neu zu laden. Wenn Sie Änderungen an der Datei vorgenommen haben, können Sie mit :edit! Das Neuladen der aktuellen Datei erzwingen (Sie verlieren Ihre Änderungen).

Der Befehl :edit Kann mit :e Abgekürzt werden. Die Force-Bearbeitung kann somit mit :e! Durchgeführt werden.

484
Thushi

Zusätzlich zum manuellen Aktualisieren der Datei mit :edit Können Sie sie in Ihren ~/.vimrc Einfügen.

:set autoread

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

196
Ingo Karkat

TL; DR

Springe zum Wrap-up Überschrift für die vimrc Zeilen, die hinzugefügt werden müssen, um Ihr Leben besser zu machen.

Manuell

Lauf :checktime

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

Automatisch

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

set autoread

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

Diese Antwort fügt eine Einschränkung hinzu:

Autoread lädt die Datei nur neu, wenn Sie einen externen Befehl ausführen (z. B. !ls oder !sh usw)

Lesen Sie weiter für Lösungen.

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

Fügen Sie Ihrem vimrc hinzu:

au CursorHold,CursorHoldI * checktime

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

Trigger bei Pufferwechsel oder Terminalfokus

Fügen Sie Ihrem vimrc Folgendes hinzu, um autoread auszulösen, wenn Sie die Puffer wechseln, während in vim:

au FocusGained,BufEnter * :checktime

Fangen des Fokus des Terminalfensters in der Ebene

Damit FocusGained (siehe oben) in einfachem vim in einem Terminalemulator (Xterm, tmux usw.) funktioniert, installieren Sie das Plugin: vim-tmux-focus-events

Bei tmux-Versionen> 1.9 müssen Sie .tmux.conf:

set -g focus-events on

Einpacken

Benachrichtigungen, wenn autoread Trigger ebenfalls möglich sind .

Hier sind meine vimrc Zeilen, um alle oben genannten 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() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | 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 für den Hinweis in die richtige Richtung mit au CursorHold .

Vielen Dank an diese Antwort für die Lösung des cmdwin-Problems.

74
Tom Hale