Vim-当错误文件发生变化时自动重新加载quickfix错误文件

Vim-当错误文件发生变化时自动重新加载quickfix错误文件

我有一个文件 (errors.txt),其中包含错误列表(代码样式问题),我将其加载到 Vim quickfix ( :cf errors.txt) 中。当我修复错误时,errors.txt 会被外部程序(独立于 Vim 运行)自动更新。有没有办法让 Vim 在 errors.txt 更改时自动刷新 quickfix 列表?

请注意,我不想让 Vim 更新 errors.txt。另一个程序会这样做,但我不想从 Vim 调用它。我只想让 Vim quickfix 监视 errors.txt 的更改。谢谢!

搜索标签:vim quickfix 更新重新加载刷新监控文件自动更新

答案1

如果您有足够新的 Vim 版本(不确定是哪个,但如果您运行vim --version,则需要查看+timers),您可以设置一个异步计时器来检查文件是否已被修改,并运行另一个计时器cfile errors.txt以重新加载 quickfix 窗口的内容。这是一个概念验证(检查这里语法高亮版本):

" 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任何你不知道的功能或命令),并构建一些适合你特定需求的东西。

答案2

我找到了一个针对我自己的问题的建议,希望它能在这里引发一些讨论。我可以使用 Vim 的客户端/服务器功能,这将允许另一个进程告诉 Vim 更新 Quickfix 列表。在这种情况下,我的后台程序可以在 Vim 更新 errors.txt 时通知它!查看本节举一个类似的例子。如你所见,另一个程序使用- 偏僻的告诉 Vim 要做什么。

唯一的问题是我的同事使用的 Vim 版本没有编译 +clientserver...我希望有一个更“开箱即用”的解决方案......

相关内容