ファイルがディスク上で変更されるとすぐにVIMでファイルを自動リロードする


32

ファイルのVIMバッファに保存されていない変更がないと仮定すると、ファイルがディスク上で変更された場合に自動的にリロードしたいと思います。最も頻繁に使用されるのは、ファイルが存在する作業コピーを更新する場合です。

どうすればこれを達成できますか?


これはあなたの言っていることだと思いますが、私の特定のユースケースは、別のgitブランチをチェックアウトするかコミットするときに、vimにファイルをリロードさせることです。
ネイサンロング

回答:



11

これは私のために働いたものです

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

最初の行だけでは不十分でした。あなたを入れることができます.vimrc

ファンハイクアンの功績


autocmdは必要ないはずです。checktimeは、CursorHoldイベントがトリガーされると同時に内部で実行されることになっています。つまり、Vimに2回目のチェックタイムを実行させるだけです。
ヘプタイト

私にはそれが必要です。多くの研究の結果、私が見つけた最良の解決策。@ヘプタイト、あなたの主張の章と詩はありますか?
トム・ヘイル

1
@TomHale私はVimのドキュメントをレビューしましたが、私が知る限り明示的には言っていませんが、「:help timestamp」は私がエラーになっていることを示しているようで、Vimは特定のイベントのチェックのみを実行し、そのため、autocmdはより頻繁にチェックするために必要になる場合があります。
ヘプタイト

5

自動読み取りが正しく機能しません。以下は私のために働く:

最初にここからスクリプトをインストールする必要があります

そのように、セットアップ関数を直接呼び出すことで、最高の結果が得られました。

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

この理由は、ipython / screen / vimセットアップを実行したいからです。

これを簡単にビューの拡張バージョンに変換できます。

プロセスのスクリプトを作成します。

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt

1
gVimやMacVimなどのvim GUIのいずれかを使用している場合、autoreadコマンドは環境の他の部分とうまく統合されます。たとえば、他のプログラム、別のエディター、またはソース管理からファイルを編集してからvimに切り替えると、更新されたファイルが自動的に読み込まれます。問題は、vimの端末バージョンがどのように統合されているかにあるようです。GUIで、またはtmuxのようなターミナルマルチプレクサを使用してプログラムを切り替えると、ターミナルバージョンは認識できないため、関連する時間に自動読み取りできません。関連するファイルシステムイベントをvimがサブスクライブするだけでいいのですが。
bames53

3

これまでのところ、vim-autoreadプラグインが機能しました。

vim-autoread

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


このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
ブルギ

@Burgi問題を解決する方法を説明するプラグインの説明を追加しました。
ヴォイテッククルゼフスキ

試しましたがj、効果的な更新を確認するにはナビゲーションコマンド(など)を入力する必要があります。これに関する問題をここに作成しました:github.com/djoshea/vim-autoread/issues/3
Martin Delille

3

この回答から(PhanHaiQuangによる回答と@flukusによるコメントを参照)

必要なときにex(whimin)からこのonelinerを実行できます(または、ログファイルが開かれたときのために、各コマンドをvimrcに入れます)。

:set autoread | au CursorHold * checktime | call feedkeys("lh")

説明:
- 自動読み取り:外部から変更されたときにファイルを読み取ります(ただし、それ自体では機能せず、内部タイマーなどはありません。vimがexのコマンドのようにアクションを実行する場合にのみファイルを読み取ります:!
- CURSORHOLD * checktime:カーソルが「updatetime」を指定した時間のために、ユーザによって動かされていない(デフォルトは4000ミリ秒です)checktimeが実行され、ファイルの外部からの変更をチェック
- コールfeedkeys(「LH」):カーソルを1回、左右に1回移動した後、何も起こりません(...つまり、CursorHoldがトリガーされ、ループがあることを意味します


lhカーソルが行の最後の位置にある場合、何もしませんlh。その位置を変更します。
マフムードアルクシ

まさにそれがポイントです。ファイルは、最小限の操作またはファイルへの変更でリロードされます。必要に応じて最後の行または最初の行にジャンプすることもできます(lhをggまたはGに置き換えてください)が、ここでの目標は、vimでファイルをリロードすることだけです。ここで何をするのが好きですか?
エリ

その後、再びオートリードをトリガーアクション(私が説明していることを述べた)、 - 「LH」はちょうどCURSORHOLD誘発すること、を意味MahmoudAl-Qudsi ... @
イーライ

1

Vimのバージョンに応じて動作する可能性のあるプラグインがここにリストさています。

別のアプローチはchecktime、外部プロセスからコマンドを定期的にvimに送信することです。これを行うShellJSスクリプトを次に示します(shelljs-plugin-sleep必須、NeoVim、およびnvr

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.