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