web-dev-qa-db-ja.com

vi(m)で開かれたファイルの変更されたコンテンツを更新する

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

379
twan163

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

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

484
Thushi

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

:set autoread

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

196
Ingo Karkat

TL; DR

Wrap-up見出しにスキップして、vimrc行を追加し、あなたの人生をより良いものにします。

手動で

実行 :checktime

Vim以外で変更されたバッファーがないか確認します。これにより、2つのバージョンのファイルが作成されるかどうかが確認され、警告が表示されます。

自動的に

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

set autoread

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

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

外部読み取りコマンド(!ls!shなど)を実行しない限り、自動読み取りはファイルをリロードしません。

ソリューションについて読みます。

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

vimrcに追加:

au CursorHold,CursorHoldI * checktime

デフォルトでは、カーソルが4秒間静止した後に CursorHold がトリガーされ、 pdatetime を使用して構成できます。

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

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

au FocusGained,BufEnter * :checktime

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

FocusGained(上記を参照)をプレーンvimで機能させるには、ターミナルエミュレーター(Xterm、tmuxなど)内でプラグインをインストールします。 vim-tmux-focus-events

Tmuxバージョン> 1.9では、.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() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | 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 で正しい方向を示してくれてありがとう。

Cmdwinの問題を解決してくれて this answer に感謝します。

74
Tom Hale