現在のファイルをリロードするにはどうすればよいですか?


145

多くの場合、バージョン管理されているファイルを使用しているため、Vimの外部で変更を加えることができます。

Vimを閉じて再度開くことなくファイルをリロードする簡単な方法は何ですか?そして、これを自動的に行う方法はありますか?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
トム・ヘイル

あなたがインストールしている場合のvim-よくある質問を、あなたがオフラインで答えを得ることができます:h vim-faqし、検索します/reload。覚えにくいタグは:h faq-5.8です。
Hotschke

回答:


172

必要なコマンドは:e(の略:edit)です。使用:edit!すると、ローカルの変更が破棄され、リロードされます。

またset autoread、vimrc でvimにこれを自動的に実行させることもできます。


5
に関する回答および解決策については、この回答を参照してくださいautoread
トム・ヘイル

4
すべてのバッファでこれを行うには、:bufdo :eまたは:bufdo :e!
アーロンH.

1
しゅう 有難うございます!私は通常、一度に何百ものバッファを開いており、ブランチを切り替えるとき、通常はvimを閉じて再起動し、新しいコンテンツですべてのバッファを更新します。これは大きな時間節約になります!
g19fanatic

1
しゅう 2番目:はオプションです:bufdo e。同じように機能します。
JoL

19

多くの場合、この答えが説明set autoreadするように機能しません:

自動コマンドは、外部コマンドを実行するなどの操作(!lsまたは!shなど)をしない限り、ファイルをリロードしません。

フォーカスイベントはトリガーされますがautoread、これらを使用しない限りキャプチャされませんgvim。したがって、vimターミナルウィンドウまたはtmux内でプレーンに実行する場合は、プラグインvim-tmux-focus-eventsをインストールします。

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

set -g focus-events on

さらに良い点として、vim 内でバッファーを変更するvimrcとトリガーが次のように追加されます:autoread

au FocusGained,BufEnter * :checktime

これは長年私を悩ませてきました。徹底的な解決策をありがとう!💯😄
ネイサンロング

9

現在のバッファを変更する外部コマンドをVimから実行したことがある場合、ディスクに変更が加えられたため、ファイルをリロードするように求められることに気づいたかもしれません。:checktimeコマンドを使用して、実際にこのプロンプトを呼び出すことができます。


3

https://github.com/djoshea/vim-autoreadを改善する素敵なプラグインautoread

vimは、ディスクに書き込まれたが、vimからの最後の書き込み以降にバッファ内で変更されていないファイルを自動的にリロードします。これにより、vimで開いたファイルを別のアプリケーションを使用して編集し、保存することができます。vimに戻ると、最後の変更以降にファイルを変更していない限り、手動で:eを押したかのように、ファイルはディスク上で行われた変更を反映するように自動的に更新されます。


Vi Stack Exchangeへようこそ。これはほぼリンクのみの回答です。プラグインを説明することで改善できます(たとえば、何をするのですか。OPの目標を達成するためにどのように使用しますか)
John O'M。

0

ファイルの内容を見て、ファイルを外部で更新し、変更されたファイルを表示し、必要に応じて編集するオプションがあるという問題がありました。この答えに触発されたVimサーバー/リモートコマンドラインオプションで解決しました。


次のコマンドを使用すると、外部コマンドを使用してファイルをリロードできます。まず、サーバーインスタンスを起動しながら、Vimで問題のファイルを開きます。

vim --servername JABBERWOCKY /tmp/alice.log

ファイルがaなどによって外部的に変更されたと仮定しましょうecho "Curiouser and curiouser" >> /tmp/alice.log。必要に応じて、ファイルを再ロードするコマンドをサーバーインスタンスに送信します。このコマンドはすぐに終了し、新しいエディターは生成されません。

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

開かれたファイルがVimと外部で変更された場合、リロード中に競合が発生します(警告メッセージが表示されます)。その場合、決定を下す必要があります。そのままにしてVimで変更を保持するか、ローカルの変更を破棄してリロードを強制します。


上記のコマンドを使用--remote-sendするには、手動でリロードする必要があります。ただし、そのコマンドは、Bashのfor/ whileを使用するか、Linux / Unixでハッキングされたワンライナーを使用して、単純なループに結び付けることができます。

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

テストされていませんが、PowerShellでもこのようなことが実現できると確信しています。

Linux / Unixでは、あまりにもクレイジーなファイルシステムを使用していない場合、inotifyライブラリなどを使用してファイルシステムイベントをリッスンすることで、イベント駆動型のアプローチを実現できます。個人的には、ツールentrを使うのが好きです。これは主要なLinuxディストリビューションに含まれているようです。その後、私は得る:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.