在Vim中,我希望每次运行新搜索时都执行一个特定的函数。我真正喜欢的是每次搜索寄存器被更改时都会触发autocmd的事件,但我知道没有这样的事件。如何在每次搜索后执行呼叫
另一种方法是重新映射/命令执行搜索,然后调用我的函数。这似乎是更容易的解决方案,但我想我不知道如何重新映射这种类型的操作并保留搜索字符串。我需要重新映射/到一个函数,然后在该函数中使用getchar()来读取搜索模式,然后将其传递给真正的搜索功能?这样做是否会在s函数中导致意想不到的后果?
也许我应该采取不同的方法?
作为一个附注,我的应用程序是我想为搜索模式设置一个单独的高亮组,如果它位于我的光标下方,那么常规搜索将具有等同于IncSearch高亮组的组。当有很多匹配时,我发现使用/和n来移动它们时很难看到我的光标在哪里。我在n的重新映射中添加了我的函数,并且它按照我的意愿工作,但是我无法将它用于第一次搜索。
=======编辑1:我觉得的事情型我正在寻找=========
这将是很好,如果我可以做类似这
:nnoremap//:call MyFunction()<cr>
或
nnoremap/:call MySearch()<cr>
function! MySearch()
normal!/
call MyFunction()
endfunction
但是,这并不工作,因为替代用户类型之前发生的搜索模式。我不知道如何等待,直到搜索模式输入并将其传递给函数或其他东西。
在这种情况下我喜欢使用的是递归宏。 首先你必须':set nowrapscan' 然后使用搜索操作来搜索你想要修改的文本/ 开始使用'qq'然后'n'录制你的宏,那么命令/函数就像':调用MyFunction()' 然后'q' 并在宏中添加对宏的调用: 'let @q。='@ q'' 最后回到用gg开始缓冲并用'@ q'重播宏。 宏将搜索你输入的表达式并应用记录的命令,直到最后一个引用被匹配。请记住,不要忘记':set nowrapscan' – rbernabe
感谢您的关注。你能解释一下如何重映射/在这种情况下?我希望搜索以通常的方式工作(不必使用@符号),但每次搜索寄存器更改时,我的函数(不会更改缓冲区)都可以运行。 – farnsy
你可以试试[这个插件](https://github.com/ivyl/vim-bling)。 – romainl