我找到了解决办法。
解决方案有效,但丑陋。
关键是在正确的时间自动调用errormarker的SetErrorMarkers()函数。
我尝试了 Peter Rincker 的解决方案,但事实证明 AsyncCommandQuickFixCmdPost 被解雇得太早了。快速修复列表尚未设置。所以SetErrorMarkers() 什么都不做。
我阅读了一些AsyncCommand 的手册并跟踪了一些代码,AsyncMake 实际上是一个包装器,它调用
asynccommand#run(cmd, handler)
与
asynccommand#run("make", asynchandler#qf)
// where asynchandler#qf is the handler to read quick fix list back.
所以,由于asynchandler#qf可以在正确的时间被调用,我追踪了asynchandler#qf的调用点,并在文件asynccommand.vim第92行找到函数asynccommand#done调用asynchandler#qf。
function! asynccommand#done(temp_file_name)
" Called on completion of the task
let r = s:receivers[a:temp_file_name] "handlers are registered in s:receivers
if type(r.dict) == type({})
call call(r.func, [a:temp_file_name], r.dict)
else
call call(r.func, [a:temp_file_name])
endif
unlet s:receivers[a:temp_file_name]
delete a:temp_file_name
endfunction
知道了!
让我们在第 101 行添加一些代码来调用 SetErrorMarkers() 函数
...
unlet s:receivers[a:temp_file_name]
if exists("*ExposeSetErrorMarkers")
call ExposeSetErrorMarkers()
endif
delete a:temp_file_name
...
注意我们在这里调用的函数是ExposeSetErrorMarkers() 而不是SetErrorMarkers()。因为SetErrorMarkers()是脚本本地函数,不能从脚本外部调用。所以我在errormarker.vim 中添加了一个委托函数ExposeSetErrorMarkers() 来公开该函数。
function! ExposeSetErrorMarkers()
call s:SetErrorMarkers()
endfunction
此外,我在.vimrc 中添加了一些自动命令
au BufWritePost *cpp AsyncMake
au BufWritePost *cc AsyncMake
au BufWritePost *h AsyncMake
每次保存源文件时自动调用 AsyncMake。
有效!丑,不过:P