我正在开发一个小型 vim 插件,需要添加一个 autocmd
来在退出插入模式时调用我的函数之一 MakeMatch
。
获取要调用的函数的实际设置非常简单:
augroup Poi
autocmd!
autocmd InsertLeave * call s:MakeMatch()
augroup END
最初我的印象是该函数没有被调用,但后来我在定义中添加了一个 echo
并看到了打印出来的字符串。
该函数本质上如下:
function! s:MakeMatch()
"Iterate and create g:build_string up
"g:build_string=":match poi /\%5l\|\%6l/"
execute g:build_string
endfunction
如果我要:call s:MakeMatch()
,构建字符串将按照我在离开插入模式时的预期成功执行。
我在其他插件中看到使用 au * exec..
没有问题的代码。我想知道这是否是在 InsertLeave
期间调用 match 的问题;我绝对可以看到有一些东西在调用 hi clear
或者可能在 InsertLeave
期间不允许突出显示。
一直在和同事一起研究这个问题,但没能让它运行比赛。我们尝试直接调用匹配和其他类型的执行。很想获得更多关于为什么这可能不起作用的信息。
大家有什么想法吗?
编辑: 这是full code for the plugin我写过。现在它正在按预期工作:D
最佳答案
我尚未确认这是“正确”的方法,但它对我有用。
- 删除了
augroup
并简单地定义autocmd
当 vim 加载我的插件的.vim
时,它将正确执行文件。 -
autocmd InsertLeave * call s:MakeMatch()
由于一些原因,有点偏离目标。最明显的是<SID>
尝试调用该函数时应该使用。
顺便说一句; @Peter Rinker:提到尝试运行autocmd InsertLeave * match Search /./.
在 :Ex
中运行时,它就像一个魅力模式,但如果您尝试定义 au!
在plugin/vimrc 文件中它将无法工作..
我认为这可能与match
有关。不是eval
函数,但我不确定是否确实如此。
- 确保它以
Ex
的形式运行命令。由于我必须运行命令而不是定义它,所以我必须更改为{event}
并调用execute
与:
就像我为让 @Peter 的建议发挥作用所做的那样。
au! VimEnter * execute(":autocmd InsertLeave * call <SID>MakeMatch()")
上面的方法对我有用,但我肯定对任何其他方法/更多信息感兴趣。
关于vim - 调用函数时 Autocmd 未运行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661761/