Vim 调用函数时,Autocmd未运行execute

Vim 调用函数时,Autocmd未运行execute,vim,vim-plugin,Vim,Vim Plugin,我正在开发一个小型vim插件,需要添加一个autocmd,以便在退出插入模式时调用我的一个函数MakeMatch 获取要调用的函数的实际设置非常简单: augroup Poi autocmd! autocmd InsertLeave * call s:MakeMatch() augroup END 最初我的印象是函数没有被调用,但后来我在定义中添加了一个echo,并看到字符串被打印出来 该功能基本上如下所示: function! s:MakeMatch() "Iterate and

我正在开发一个小型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
如果我要
:调用s:MakeMatch()
生成字符串将成功执行,正如我在离开插入模式时所预期的那样

我在其他插件中看到过使用
au*exec..
而没有问题的代码。我想知道这是否是在
InsertLeave
期间调用match的问题;我可以肯定地看到有东西在调用
hi clear
或者在
InsertLeave
期间不允许突出显示

我一直在和一个同事玩这个游戏,但没能让它运行比赛。我们尝试直接调用匹配和其他类型的执行。。我很想得到更多关于为什么这可能不起作用的信息

有人有什么想法吗

编辑:
这是我写的。现在它正在按预期工作:D

我还没有确认这是一个“正确”的方法,但它是一个对我有效的方法

  • 删除了
    augroup
    ,只需定义一个
    autocmd
    ,当vim加载我的插件的
    .vim
    文件时,它将正确执行
  • autocmd InsertLeave*调用s:MakeMatch()
    由于一些原因有点偏离了标准。最明显的是,在尝试调用函数时应该使用
    作为旁白@Peter Rinker:提到尝试运行
    autocmd InsertLeave*匹配搜索/
    ,当在
    :Ex
    模式下运行时,它就像一个符咒,但是如果您尝试定义
    au在plugin/vimrc文件中,它将不起作用。。
    我认为这可能与
    match
    不是
    eval
    函数有关,但我不确定实际情况是否如此

  • 确保它作为
    Ex
    命令运行。因为我必须运行命令而不是定义它,所以我必须切换到
    {event}
    ,并使用
    调用
    execute
    ,就像我为了让@Peter的建议起作用所做的那样
  • au!VimEnter*执行(“:autocmd InsertLeave*调用MakeMatch()”)


    上述方法对我来说很有效,但我肯定对任何其他方法/更多信息感兴趣。

    你当然可以这样做。简单测试用例:
    autocmd InsertLeave*匹配搜索/
    。这将不会有任何问题。所以很可能是你如何构建你的
    g:build\u字符串。(这个变量真的应该是全局变量吗?)注意:
    InsertLeave
    在使用
    退出插入模式时不会触发。请参见
    :h InsertLeave
    。能否显示生成字符串的代码?正如所发布的那样,您的代码是有效的(如果您将poi更改为存在的突出显示组),因此我发现将命令添加到文件中无法正确执行。如果我做了
    :au InsertLeave*匹配搜索/
    ,它将像一个符咒一样工作。不知道为什么它不会在文件本身中响应它。。