Vim 如何在每次搜索后执行调用

Vim 如何在每次搜索后执行调用,vim,Vim,在Vim中,我希望在每次运行新搜索时执行一个特定的函数。我真正想要的是一个事件,它可以在每次更改搜索寄存器时触发autocmd,但我知道没有这样的事件 另一种方法是将/命令重新映射到执行搜索的对象,然后调用my函数。这似乎是一个更简单的解决方案,但我想我不知道如何重新映射这种类型的操作并保留搜索字符串。我是否需要重新映射/到一个函数,然后在该函数中使用getchar读取搜索模式,然后将其传递给真正的搜索函数?这样做是否会在:s函数中导致意外后果 也许我应该采取不同的方法 作为补充说明,我的应用程

在Vim中,我希望在每次运行新搜索时执行一个特定的函数。我真正想要的是一个事件,它可以在每次更改搜索寄存器时触发autocmd,但我知道没有这样的事件

另一种方法是将/命令重新映射到执行搜索的对象,然后调用my函数。这似乎是一个更简单的解决方案,但我想我不知道如何重新映射这种类型的操作并保留搜索字符串。我是否需要重新映射/到一个函数,然后在该函数中使用getchar读取搜索模式,然后将其传递给真正的搜索函数?这样做是否会在:s函数中导致意外后果

也许我应该采取不同的方法

作为补充说明,我的应用程序是,如果搜索模式在我的光标下,我想为它设置一个单独的突出显示组,这样常规搜索将具有与IncSearch突出显示组等效的功能。当有许多匹配项时,我发现使用/和n在其中移动时很难看到光标的位置。我在n的重新映射中添加了我的函数,它可以按照我的要求工作,但是我无法让它在第一次搜索中工作

======编辑1:我想我要找的东西的类型=========

如果我能做这样的事情就好了

:nnoremap / /:call MyFunction()<cr>


但这不起作用,因为替换发生在用户键入搜索模式之前。我不知道如何等到键入搜索模式并将其传递给函数或其他东西。

感谢Romaill指出该插件。这与我正在做的事情和阅读他们的代码有着相似的目标,我了解到他们已经找到了一种重新映射搜索功能的方法。我实现了一个类似的东西,它可以工作

以下是解决方案:

# function to replace default <enter> expression
function MySearch()
  if getcmdtype() == '/'
    return "\<cr>:call MyFunction()\<cr>"
  else
    return "\<cr>" 
  endif
endfunction

:cnoremap <silent> <expr> <enter> MySearch()
基本上,我们没有重新映射/,而是重新映射完成搜索命令的。在其他时间也输入get-typed,因此我们检查这是否是搜索,然后才执行该函数


也许还有其他的解决办法,但这个办法很有效,我学到了一些新东西。谢谢

在这种情况下,我喜欢使用递归宏。首先,您必须:立即设置RapScan,然后使用搜索操作搜索要修改的文本/开始使用qq录制宏,然后使用n,然后使用以下命令/函数:call MyFunction,然后使用q,并在宏中添加对宏的调用:let@q.='@q'最后使用gg返回到缓冲区的开始并重播宏使用@q宏将搜索您键入的表达式,并应用记录的命令,直到最后一个引用匹配为止。记住不要忘记:现在就开始,谢谢你看这个。你能解释一下在这种情况下如何重新映射吗?我希望搜索能够以通常的方式工作,而不必使用@符号,但每次搜索寄存器发生变化时,我的函数不会改变缓冲区的运行。您可以尝试。
# function to replace default <enter> expression
function MySearch()
  if getcmdtype() == '/'
    return "\<cr>:call MyFunction()\<cr>"
  else
    return "\<cr>" 
  endif
endfunction

:cnoremap <silent> <expr> <enter> MySearch()