Wie lade ich die aktuelle Datei neu?


145

Sehr oft arbeite ich mit Dateien, die versionskontrolliert sind, sodass Änderungen außerhalb von Vim möglich sind.

Was ist eine schnelle Möglichkeit, die Datei neu zu laden, ohne Vim schließen und erneut öffnen zu müssen? Und gibt es eine Möglichkeit, dies automatisch zu tun?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale

Wenn Sie vim-faq installiert haben , können Sie dort eine Offline-Antwort erhalten: :h vim-faqund suchen /reload. Das schwer zu merkende Tag ist :h faq-5.8.
Hotschke

Antworten:


172

Der gewünschte Befehl lautet :e(kurz für :edit). Wenn Sie es verwenden :edit!, werden lokale Änderungen verworfen und neu geladen.

Sie können vim auch veranlassen, dies automatisch set autoreadin Ihrem vimrc zu tun.


5
In dieser Antwort finden Sie Hinweise und Lösungen zu autoread.
Tom Hale

4
Verwenden Sie dazu für alle Puffer :bufdo :eoder:bufdo :e!
Aaron H.

1
@AaronH. Danke für das! Normalerweise sind Hunderte von Puffern gleichzeitig geöffnet, und beim Wechseln von Zweigen schließe ich normalerweise vim und starte neu, um alle Puffer mit neuen Inhalten zu aktualisieren. Dies wird eine große Zeitersparnis sein!
g19fanatic

1
@AaronH. Der zweite :ist optional: :bufdo efunktioniert genauso.
JoL

19

In vielen Fällen set autoreadwird nicht funktionieren, wie diese Antwort erklärt:

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

Fokusereignisse werden ausgelöst autoread, diese werden jedoch nur mit erfasst gvim. Wenn Sie also einfach vimin einem Terminalfenster oder in tmux laufen, installieren Sie das Plugin vim-tmux-focus-events .

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

set -g focus-events on

Für zusätzliche Güte, wenn Sie Folgendes zu Ihrem vimrcTrigger hinzufügen, autoreadwenn Sie die inneren Puffer wechseln, während Sie sich in vim befinden:

au FocusGained,BufEnter * :checktime

Das nervt mich schon seit Jahren. Danke für eine gründliche Lösung! 💯😄
Nathan Long

9

Wenn Sie jemals einen externen Befehl von Vim aus ausgeführt haben, der den aktuellen Puffer ändert, haben Sie möglicherweise bemerkt, dass Sie aufgefordert werden, die Datei neu zu laden, da Änderungen an der Festplatte vorgenommen wurden. Sie können diese Eingabeaufforderung tatsächlich mit dem :checktimeBefehl aufrufen .


3

Nettes Plugin zur Verbesserung von autoread https://github.com/djoshea/vim-autoread

Veranlasst vim automatisch, Dateien neu zu laden, die auf die Festplatte geschrieben, aber seit dem letzten Schreiben von vim nicht im Puffer geändert wurden. Dadurch kann eine in vim geöffnete Datei mit einer anderen Anwendung bearbeitet und gespeichert werden. Wenn Sie zu vim zurückkehren und die Datei seit der letzten Änderung nicht geändert haben, wird die Datei automatisch aktualisiert, um die auf der Festplatte vorgenommenen Änderungen widerzuspiegeln, als hätten Sie Folgendes gedrückt: e manuell.


Willkommen bei der Vi Stack Exchange. Dies ist fast eine Nur-Link-Antwort. Sie können es verbessern, indem Sie das Plugin beschreiben (z. B. was macht es? Wie würde man es verwenden, um die Ziele von OP zu erreichen?)
John O'M.

0

Ich hatte das Problem, den Inhalt einer Datei zu betrachten, die Datei extern zu aktualisieren, die geänderte Datei anzuzeigen und die Option zu haben, sie bei Bedarf zu bearbeiten. Ich habe es mit den Vim-Server- / Remote-Befehlszeilenoptionen gelöst, inspiriert von dieser Antwort .


Mit den folgenden Befehlen kann eine Datei über einen externen Befehl neu geladen werden. Öffnen Sie zuerst die betreffende Datei mit Vim, während Sie eine Serverinstanz starten.

vim --servername JABBERWOCKY /tmp/alice.log

Angenommen, die Datei wurde extern geändert, z echo "Curiouser and curiouser" >> /tmp/alice.log. B. durch a . Senden Sie bei Bedarf einen Befehl an die Serverinstanz, um die Datei neu zu laden. Dieser Befehl wird schnell beendet und erzeugt keinen neuen Editor.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Wenn die geöffnete Datei in Vim und extern geändert wurde, liegt beim erneuten Laden ein Konflikt vor (eine Warnmeldung wird angezeigt). In diesem Fall muss eine Entscheidung getroffen werden: Belassen Sie dies und behalten Sie die Änderungen in Vim bei, oder verwerfen Sie lokale Änderungen und erzwingen Sie ein erneutes Laden .


Der --remote-sendobige Befehl erfordert manuelles Neuladen. Dieser Befehl kann jedoch mit Bashs for/ whileoder einem hackigen Einzeiler in Linux / Unix an eine einfache Schleife gebunden werden :

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Obwohl nicht getestet, bin ich mir sicher, dass so etwas auch in PowerShell realisiert werden kann.

Unter Linux / Unix kann ein ereignisgesteuerter Ansatz realisiert werden, indem Dateisystemereignisse beispielsweise mit der inotify- Bibliothek abgehört werden , wenn Sie nicht zu verrückte Dateisysteme verwenden. Persönlich benutze ich das Tool entr sehr gerne , das in großen Linux-Distributionen enthalten zu sein scheint. Dann bekomme ich:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.