多くの場合、バージョン管理されているファイルを使用しているため、Vimの外部で変更を加えることができます。
Vimを閉じて再度開くことなくファイルをリロードする簡単な方法は何ですか?そして、これを自動的に行う方法はありますか?
多くの場合、バージョン管理されているファイルを使用しているため、Vimの外部で変更を加えることができます。
Vimを閉じて再度開くことなくファイルをリロードする簡単な方法は何ですか?そして、これを自動的に行う方法はありますか?
回答:
必要なコマンドは:e
(の略:edit
)です。使用:edit!
すると、ローカルの変更が破棄され、リロードされます。
またset autoread
、vimrc でvimにこれを自動的に実行させることもできます。
:bufdo :e
または:bufdo :e!
:
はオプションです:bufdo e
。同じように機能します。
多くの場合、この答えが説明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
https://github.com/djoshea/vim-autoreadを改善する素敵なプラグインautoread
vimは、ディスクに書き込まれたが、vimからの最後の書き込み以降にバッファ内で変更されていないファイルを自動的にリロードします。これにより、vimで開いたファイルを別のアプリケーションを使用して編集し、保存することができます。vimに戻ると、最後の変更以降にファイルを変更していない限り、手動で:eを押したかのように、ファイルはディスク上で行われた変更を反映するように自動的に更新されます。
ファイルの内容を見て、ファイルを外部で更新し、変更されたファイルを表示し、必要に応じて編集するオプションがあるという問題がありました。この答えに触発された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>"
" Compare buffer with saved version
nnoremap gd :DiffSaved<CR>