vim - 调用函数时 Autocmd 未运行执行

标签 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 期间调用 match 的问题;我绝对可以看到有一些东西在调用 hi clear 或者可能在 InsertLeave 期间不允许突出显示。

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

大家有什么想法吗?

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

最佳答案

我尚未确认这是“正确”的方法,但它对我有用。

  1. 删除了 augroup并简单地定义 autocmd当 vim 加载我的插件的 .vim 时,它将正确执行文件。
  2. 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/

    相关文章:

    vim - MacVim 配色方案快捷键

    vim - Show Marks插件在大约4秒钟后导致 'pop in'出现标记

    regex - 如何在vim中用大括号括住视觉上选择的文本

    Vim Supertab 插件在导航完成菜单时反转方向

    vim 8.1 - 屏幕上的垃圾打印

    使用 tmux 时不显示 Vim 行号设置

    vim 当前的高亮语言

    vim - 仅使用替换命令替换 vim 中的部分行

    c++ - 如何修复 YouCompleteMe 错误突出显示 "cout"用法的错误?

    Vim 插件在多个打开的缓冲区中自动完成