Vimで開いているファイルを再読み込みする(:e!)
ログファイルを監視しながら編集していたり、別プロセスやgit操作でファイルが外部から書き換わったりすると、Vim側のバッファは古い内容のままになる。そんなときはファイルを開き直さなくても、再読込コマンド1つで最新化できる。
今のバッファを再読込する
:edit
:e
変更していない状態であれば、これだけでディスク上の最新内容を読み直せる。ただし、バッファ側に未保存の変更がある場合はエラーになって拒否される。その変更を破棄してでも強制的に読み直したいときは、末尾に!を付ける。
:edit!
:e!
Vim側の未保存の変更は失われるので、必要な変更があれば先に保存するか、破棄してよいことを確認してから使う。
全バッファをまとめて再読込する
複数ファイルを同時に開いている場合、1つずつ:eするのは手間がかかる。:bufdoを使えば、開いている全バッファに対してまとめてコマンドを実行できる。
:bufdo edit
:bufdo edit!
全タブページをまとめて再読込する
タブ単位で作業している場合は:tabdoが使える。
:tabdo edit
:tabdo edit!
特定のバッファだけ選んで再読込する
:bufdoは開いている全バッファが対象になるため、無関係なファイルまで巻き込みたくない場合もある。そうしたときは、対象のバッファに移動してから個別に:e!を実行するほうが安全。バッファ番号を指定して移動するには次のようにする。
:buffer 3
:e!
不要な再読込を避けたい場面、例えば一部のバッファにあえて未保存の変更を残しておきたいときは、こちらの個別実行を選ぶとよい。
:e!、複数まとめてなら:bufdo e!または:tabdo e!。強制読込は未保存の変更を消す点に注意。autocmdで自動再読込にする
ファイルが外部で頻繁に更新される用途(ログ監視など)なら、フォーカスが戻ったタイミングで自動的に再読込する設定も組める。
autocmd FocusGained,BufEnter * checktime
:checktimeは、ファイルが外部で変更されていないかをVimに確認させるコマンド。上記のautocmdと組み合わせておくと、ウインドウにフォーカスを戻すたびに自動でチェックが走り、変更があれば再読込を促してくれる(設定によっては自動で再読込される)。
ビルドスクリプトが自動生成するログファイルをVimで開きっぱなしにしていたが、内容が古いままなことに何度も気づかず困っていた。FocusGainedでchecktimeを走らせる設定を入れてからは、ウインドウを切り替えるだけで自然と最新化されるようになった。
まとめ
外部で更新されたファイルは:e!で再読込できる。複数ファイルなら:bufdo/:tabdoと組み合わせ、頻繁に更新される用途ならautocmdで自動化しておくと手間がかからない。