vi(m)で開かれたファイルの変更内容を更新します


362

vimで開いたままにする設定ファイルがありますが、ディスク上で変更されることがありますが、これらの変更は端末に反映されません。ファイルを閉じて再度開くことなく、画面上のコンテンツを更新できますか?もしそうなら、どのように?



まとめ:これまでのすべての答えは、「プッシュ」スタイルではなく「ポーリング」です。つまり、他のソフトウェアの同様の機能によって行われたような外部ファイル変更イベントを受信する代わりに、これらの回答は、手動またはユーザーアクションまたはタイマーによってトリガーされたvimによるファイル変更のアクティブなポーリングに依存します。最終的な結果は、画面に瞬時に更新された変更が表示されないことです。
eng河at

回答:


464

:editファイル名を指定せずにコマンドを使用して、現在のファイルをリロードできます。ファイルに変更を加えた場合:edit!は、現在のファイルを強制的に再ロードするために使用でき ます(変更は失われます)。

コマンド:editはで短縮できます:e。したがって、強制編集は次の方法で実行できます。:e!


2
「!」私をつまずかせていましたが、今では明らかです。
twan163 14

107
注:通常、これはに短縮され:e!ます。
ステファンシャゼル14

31
@StephaneChazelas:うん、それはtwan163 @正しい:)です:代わりに:editして:edit!、使用することができます:eし、:e!それぞれ。
ゆえに14

11
変更を失う、はい、いいえ。決定的に、あなたはまだできuNDO :e!
gerrit

5
また、すべてのバッファーをリロードする場合は、次を実行します:bufdo e
。– pkout

193

を使用してファイルを手動で更新:editすることに加えて、~/.vimrc

:set autoread

Vimで編集されていないファイルをVimが自動的に更新するようにします。も参照してください:checktime


2
買い手は注意してください-新しいコードに取り組んでいてgit pull、画面上の保存していない変更を意図せずに失う可能性があることに気付いている場合。
アザタール

5
@toszterいいえ、Vimは未変更のバッファーのみを更新します。変更の場合、クエリを保持します:Keep、またはload?
インゴカルカット

10
NBの自動読み取りは、正確には自動的に機能しません。を使用するかgvim、外部コマンドを実行する必要があります。
スパラフーク

3
tmux内でvimを使用している場合は、github.com / tmux -plugins / vim-tmux-focus-eventsを使用してフォーカスイベントを取得できます。そうしないと、何らかの方法で電話をかけない限り、自動読み取りは端末で役に立ちません:checktime
カールバーテル

3
autoreadカーソルの移動が停止してからX秒後に自動的にトリガーされる場合があります。この回答をご覧ください。
トム・ヘイル

57

TL; DR

あなたの人生を良くするために追加する行のWrap-up見出しにスキップしてvimrcください。

手動で

走る :checktime

Vimの外部でバッファが変更されていないか確認してください。これは、ファイルの2つのバージョンで終わるかどうかを確認して警告します。

自動的に

変更を自動的にロードするには、次を追加しますvimrc

set autoread

ファイルがVimの外部で変更されたことが検出され、Vimの内部で変更されていない場合、自動的に再度読み取ります。ファイルが削除された場合、これは行われません。

この答えは警告を追加します:

あなたは(のように実行した外部コマンドのような何かをしない限り、オートリードは、ファイルを再ロードしない!lsか、!shなど)

ソリューションをお読みください。

カーソルの移動が停止したときにトリガー

に追加vimrc

au CursorHold,CursorHoldI * checktime

デフォルトでは、CURSORHOLDは、カーソルが4秒間まだ残っており、経由で設定可能です後にトリガされupdatetime

バッファー変更またはターミナルフォーカスでトリガー

vim 内でバッファーを変更するときvimrcにトリガーするには、以下を追加します。autoread

au FocusGained,BufEnter * :checktime

プレーンvim内でのターミナルウィンドウフォーカスのキャッチ

持っているFocusGained:(上記参照)普通VIM中の作業を、端末エミュレータ(Xtermの、TMUX、等)の内部にプラグインをインストール VIM-TMUX-フォーカスイベントを

1.9以上のtmuxバージョンでは、以下を追加する必要があります.tmux.conf

set -g focus-events on

要約

autoreadトリガーが発生した場合の通知も可能です。

vimrc上記のすべてを実装するための私の行は次のとおりです。

" 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

私を正しい方向に向けてくれたErichBSchulzにau CursorHold感謝ます。


2
素晴らしい投稿!これがデフォルトの動作である必要があるものの1つのように感じます
-JonnyRaa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.