autocmd not 运行 调用函数时执行

Autocmd not running execute when calling function

我正在开发一个小 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 期间调用匹配的问题;我肯定能看到调用 hi clear 的东西,或者可能在 InsertLeave 期间不允许突出显示。

一直在和一个同事一起玩这个,但没能把它带到 运行 比赛中。我们尝试直接调用匹配和其他类型的执行。希望获得更多信息,了解为什么这可能不起作用。

有人有什么想法吗?

编辑: 这是我写的 full code for the plugin。它现在按预期工作 :D

我还没有确认这是 "correct" 方法,但这是对我有用的方法..

  1. 删除了 augroup 并简单地定义了一个 autocmd,它将在 vim 加载我的插件的 .vim 文件时正确执行。
  2. 由于某些原因,
  3. autocmd InsertLeave * call s:MakeMatch() 有点偏离标准。最明显的是 <SID> 应该在尝试调用该函数时使用。

顺便说一句; @Peter Rinker:提到尝试 运行 autocmd InsertLeave * match Search /./. 当 运行 处于 :Ex 模式时,它就像一个魅力,但是如果您尝试在 au! 中定义plugin/vimrc 文件不起作用.. 我认为这可能与 match 不是 eval 函数这一事实有关,但我不确定是否确实如此。

  1. 确保它 运行 作为 Ex 命令。由于我必须 运行 命令而不是定义命令,所以我不得不更改为 {event} 并使用 : 调用 execute 就像我为获得@Peter 的建议所做的那样上班。

au! VimEnter * execute(":autocmd InsertLeave * call <SID>MakeMatch()")

以上内容对我有用,但我肯定对任何其他 approach/more 信息感兴趣。