让AsyncCommand与errormarker一起使用?

时间:2011-11-01 06:04:50

标签: vim

我在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”但什么也没得到。

有评论吗?任何建议表示赞赏。提前谢谢。

2 个答案:

答案 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