更新2015-06-25:
- 機能しすぎたため、「シェル」メソッドを廃止しました。挿入モードを停止し、ゾンビプロセスを残しました。とにかく見たいのであれば、この投稿の改訂履歴を見てください。
- :私は、このうちのプラグインを作ったauto_autoread.vim。現時点では、以下のコードと事実上同じですが、更新を受け取る可能性が高いため、プラグインを使用することをお勧めします。
何をautoread
するの?
この質問に答えるにautoread
は、まずオプションが何をするのかを理解する必要があります。さらに重要なことは、何をしないのかを理解することです。
残念ながら:help 'autoread'
、これに関する多くの情報はありません。単に、「ファイルがVimの外部で変更されたことが検出された」というだけです。Vimはファイルが変更されたことをどのように検出しますか?特定のアクションで、Vimはファイルの変更時間をチェックします。
いつ:
:checktime
使用されている;
- バッファに入ります。
:diffupdate
使用されている;
:e
既にバッファがあるファイルに対して発行されます。
!
;で外部コマンドを実行する
- (フォアグラウンドに戻って
^Z
、fg
シェルがジョブ制御を持っている場合のみ、);
gVimの場合、これは次の場合にも実行されます。
- 「右クリック」メニューを閉じます(何かを選択するか、単に閉じます)。
- フォーカスが変更されます(これは既に気づいていることです)。
- メニューから「ファイル->開く」、「ファイル->名前を付けて保存」を使用した場合にポップアップ表示されるファイルブラウザダイアログを閉じます(その他の場所も同様)。
buf_check_timestamp()
、check_timestamps()
関数、およびにneed_check_timestamps
設定されてTRUE
いる場所
へのすべての呼び出しを見つけることにより、Vimソースからこの情報を収集
しました。
私はいくつかのイベントを見逃しているかもしれませんが、覚えておくべき重要なことは、Vimはファイルが非常に限られた一連の状況で変更されたかどうかだけをチェックするということです。確かに、n秒ごとの変更に対してファイルを「ポーリング」することはありません。
だから、あなたの目的のためにset autoread
は、十分ではありません。
Pythonを使用する
これにより、Pythonスレッドがバックグラウンドで実行されるようにスケジュールされ、n秒:checktime
ごとに実行さ
れます。が有効になっている場合、これはディスクからバッファをリロードします。それ以外の場合は、単に警告します。autoread
これには、Vimが+python
または+python3
に必要です:version
。すべてのプラットフォーム(Windowsを含む)で動作するはずです。
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
を使用してこれを開始でき:call AutoreadPython()
ます。もちろん、autocmdでこれを行うことができます。例えば:
autocmd *.c call AutoreadPython()
あとがき
実際にはもっと多くのメソッドがあります。たとえばentr
、Python inotify
やgamin
モジュールなどのツールを使用してファイルの変更を監視し
たり、:checktime
引数が与えられていない場合はすべてのバッファーをチェックしたり、単一のバッファーをチェックしたり、特定のファイル。
しかし、この答えはすでにかなり長いです:-)これらの方法は、(願わくば!)ほとんどのシナリオでうまく機能するか、シナリオに簡単に適応できるはずです。
PS。私もRubyを使用しようとしましたが、残念ながらRubyスレッド(を使用Thread
)はPythonのようにバックグラウンドで実行されないため、これを機能させることができませんでした(おそらく別の方法がありますか?)
CursorHold
イベントはどうですか?Vimにフォーカスがない場合、n秒ごとにトリガーする必要があります。