调用函数时,Autocmd没有运行execute

时间:2015-04-15 22:06:01

标签: vim vim-plugin

我正在使用小型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

1 个答案:

答案 0 :(得分:1)

我还没有确认这是"正确"方法,但它是适合我的那个......

  1. 删除了augroup,只需定义一个{vim}加载我的插件autocmd文件即可正常执行的.vim
  2. 由于某些原因,
  3. autocmd InsertLeave * call s:MakeMatch()有点偏离标记。最明显的是在尝试调用函数时应该使用<SID>
  4. 撇开; @Peter Rinker:提到试图在autocmd InsertLeave * match Search /./.模式下运行时运行:Ex就像魅力一样,但如果你试图在插件/ vimrc文件中定义au!,它就会赢得“{1}}。工作.. 我认为这可能与match不是eval函数的事实有关,但我不确定实际情况是否如此。

    1. 确保它作为Ex命令运行。由于我必须运行命令而不是定义命令,因此我必须更改为{event}并使用execute调用:,就像我为了获得@ Peter的建议一样工作。
    2. au! VimEnter * execute(":autocmd InsertLeave * call <SID>MakeMatch()")

      以上为我做了诀窍,但我绝对对任何其他方法/更多信息感兴趣。