Vim-クイックフィックスエラーファイルが変更されたときに自動再読み込み


2

エラー(コードスタイルの問題)のリストを含むファイル(errors.txt)があり、それをVimクイックフィックス(:cf errors.txt)にロードします。errors.txtは、エラーを修正すると外部プログラム(Vimとは独立して実行)によって自動的に更新されます。errors.txtが変更されたときにVimがクイックフィックスリストを自動更新する方法はありますか?

Vimにerrors.txtを更新させたくないことに注意してください。別のプログラムがこれを行い、Vimから呼び出したくありません。Vim quickfixでerrors.txtの変更を監視するだけです。ありがとう!

検索タグ:vim quickfix update reload reload monitor file automatic update

回答:


1

最新の十分なバージョンのVimがある場合(どちらを使用するかわからないが、を実行するvim --version場合はを参照する必要があります+timers)、非同期タイマーを設定してファイルが変更されたかどうかを確認し、別cfile errors.txtのバージョンを実行してクイックフィックスをリロードすることができますウィンドウの内容。概念実証を次に示します(構文が強調されたバージョンについては、こちらご覧ください)。

" The filename used for the cfile
let s:cfile_filename = ''
" The last mtime of the filename
let s:cfile_mtime = -1

" Define a command that can be called like:
"
"   Cfile errors.txt
"
command! -nargs=1 -complete=file Cfile call s:Cfile(<f-args>)

function! s:Cfile(filename)
  let s:cfile_filename = a:filename

  " Update every 200ms
  let timer = timer_start(200, function('s:UpdateCfile'), {'repeat': -1})
  " First "update" to actually load the qf window immediately
  call s:UpdateCfile(timer)
endfunction

function! s:UpdateCfile(timer_id)
  " Stop the timer if the file is deleted
  if s:cfile_filename == '' || !filereadable(s:cfile_filename)
    call timer_stop(a:timer_id)
    let s:cfile_filename = ''
    let s:cfile_mtime = -1

    return
  endif

  " Get file mtime
  let mtime = system('stat -c %Y '.shellescape(s:cfile_filename))

  " Load the file in the quickfix window if the mtime is newer than the last
  " recorded one
  if mtime > s:cfile_mtime
    exe 'cfile '.s:cfile_filename
    let s:cfile_mtime = mtime
  endif
endfunction

.vimrc、またはの別のファイルに配置すると、「実際の」コマンドと同じように使用できるコマンドを~/.vim/plugins/取得できますが、この:Cfileコマンドは200ミリ秒ごとに変更に対してファイルを監視します。ファイルが削除されると、自動更新が停止します。

残念ながら、私はあなたが世話をしなければならないエッジケースがあるだろうと確信しているので、出発点としてこれを使用することをお勧めします、それを理解しようとし:helpますt)を知り、特定のニーズに合った何かを構築します。


どうもありがとう。私はこれを達成するためにタイマーの使用を検討していました。私が見つかりました。このWebページには、それがVimの古いバージョンのための「偽」のタイマーを提供として有用である(しかし、それは理想的ではありません)とバージョン8がはるかに良く見えるあなたの例で使用する「本物」のタイマーを、持っていることを言及しています。残念ながら、私のオフィスは...タイマーを持っていないのVimの古いバージョンを使用しているようだ
リッチ

申し訳ありませんが、あなたのソリューションを支持する評判はありません。しかし、私はそれが勝った場合、それを受け入れるかもしれません!
リッチ

0

ここでの議論を奨励することを希望する私自身の質問に対する提案を見つけました。Vimのクライアント/サーバー機能を使用すると、別のプロセスがVimにQuickfixリストを更新するように指示できます。この場合、私のバックグラウンドプログラムは、errors.txtを更新するたびにVimに通知できます!似たような例については、このセクションをご覧ください。ご覧のとおり、他のプログラムは--remoteを使用してVimに何をすべきかを伝えます。

唯一の問題は、同僚が使用しているVimのバージョンに+ clientserverがコンパイルされていないことです。


箱から出してできることは本当に多くありません。たぶん、CursorHoldアクティブでないときに自動コマンドvimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHoldを使用してリストを更新できます。ただし、特定のミリ秒数の間入力を停止した後にのみトリガーされるため、これも理想的ではありません。
アンドリューラデブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.