我在AsyncCommand找到了StackOverflow,发现它是一个了不起的工具!我试图让它与errormarker plugin一起使用,但遇到了一些问题。
我不知道究竟是什么问题。我跟踪了errormarker的脚本,发现错误使用以下脚本将QuickFixCmdPost
挂钩到事件,并将标记设置为源文件行。
augroup errormarker
autocmd QuickFixCmdPost make call <SID>SetErrorMarkers()
augroup END
根据:help
,第二个参数(make
)是文件的pattern
(例如:*.html
)。我不是什么是make
文件模式,我试过
autocmd QuickFixCmdPost AsyncMake call <SID>SetErrorMarkers()
它不起作用(当然)。但我不知道我还能做些什么。我用google搜索“AsyncCommand errormarker”但什么也没得到。
有评论吗?任何建议表示赞赏。提前谢谢。
答案 0 :(得分:3)
AsyncCommand在封面下使用cgetfile
来填写quickfix窗口。似乎cgetfile
不会触发QuickFixCmdPost
事件。为了让SetErrorMarkers()
在正确的时刻(或根本)被激发。我们需要创建一个新事件或将errormarker插件耦合到AsyncCommand中。由于我们都是优秀且非懒惰的程序员,所以我会建议使用方法,因为它提供了更多的灵活性。
由于您已经在编辑插件,我希望您不要介意对AsyncCommand插件进行少量添加。我假设你有github的最新版本。
我们将创建一个新的用户事件,AsyncCommand将在cgetfile
之后触发。在第63行之后的文件:autoload/asynchandler.vim
中插入以下行。
doautocmd User AsyncCommandQuickFixCmdPost
应该是这样的:
exe 'botright ' . self.mode . "open"
let cmd = self.command . ' ' . a:temp_file_name
exe cmd
doautocmd User AsyncCommandQuickFixCmdPost
if type(self.title) == type("") && self.title != ""
现在您可以将错误标记插件的错误编辑为:
augroup errormarker
autocmd QuickFixCmdPost make call <SID>SetErrorMarkers()
autocmd User AsyncCommandQuickFixCmdPost call <SID>SetErrorMarkers()
augroup END
答案 1 :(得分:0)
我找到了解决方案。
解决方案有效,但很难看。
关键是要在适当的时间自动调用errormarker
的{{1}}功能。
我尝试了Peter Rincker的解决方案,但事实证明SetErrorMarkers()
过早被解雇了。 quickfix列表尚未设置。所以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
第92行中找到函数asynccommand#done
拨打asynccommand.vim
。
asynchandler#qf
有你!
让我们在第101行添加一些代码来调用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
函数
SetErrorMarkers()
请注意,我们在此处调用的函数是 ...
unlet s:receivers[a:temp_file_name]
if exists("*ExposeSetErrorMarkers")
call ExposeSetErrorMarkers()
endif
delete a:temp_file_name
...
而不是ExposeSetErrorMarkers()
。因为SetErrorMarkers()
是脚本本地函数,所以无法从脚本外部调用。所以我在SetErrorMarkers()
中添加了一个委托函数ExposeSetErrorMarkers()
来公开该函数。
errormarker.vim
此外,我向function! ExposeSetErrorMarkers()
call s:SetErrorMarkers()
endfunction
.vimrc
每次保存源文件时自动调用AsyncMake。
有效!但是丑陋:P