2014-02-06 41 views
1

在Vim中,我希望每次运行新搜索时都执行一个特定的函数。我真正喜欢的是每次搜索寄存器被更改时都会触发autocmd的事件,但我知道没有这样的事件。如何在每次搜索后执行呼叫

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

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

作为一个附注,我的应用程序是我想为搜索模式设置一个单独的高亮组,如果它位于我的光标下方,那么常规搜索将具有等同于IncSearch高亮组的组。当有很多匹配时,我发现使用/和n来移动它们时很难看到我的光标在哪里。我在n的重新映射中添加了我的函数,并且它按照我的意愿工作,但是我无法将它用于第一次搜索。

=======编辑1:我觉得事情型我正在寻找=========

这将是很好,如果我可以做类似这

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

nnoremap/:call MySearch()<cr> 
function! MySearch() 
    normal!/
    call MyFunction() 
endfunction 

但是,这并不工作,因为替代用户类型之前发生的搜索模式。我不知道如何等待,直到搜索模式输入并将其传递给函数或其他东西。

+0

在这种情况下我喜欢使用的是递归宏。 首先你必须':set nowrapscan' 然后使用搜索操作来搜索你想要修改的文本/ 开始使用'qq'然后'n'录制你的宏,那么命令/函数就像':调用MyFunction()' 然后'q' 并在宏中添加对宏的调用: 'let @q。='@ q'' 最后回到用gg开始缓冲并用'@ q'重播宏。 宏将搜索你输入的表达式并应用记录的命令,直到最后一个引用被匹配。请记住,不要忘记':set nowrapscan' – rbernabe

+0

感谢您的关注。你能解释一下如何重映射/在这种情况下?我希望搜索以通常的方式工作(不必使用@符号),但每次搜索寄存器更改时,我的函数(不会更改缓冲区)都可以运行。 – farnsy

+1

你可以试试[这个插件](https://github.com/ivyl/vim-bling)。 – romainl

回答

0

谢谢,romainl,指出这个插件。它与我正在做的和阅读他们的代码有类似的目标,我了解到他们已经想出了一种重新映射搜索功能的方法。我实现了类似的东西,它的作品!

这里的解决方案:

# 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() 

,而不是重新映射/基本上,我们重新映射完成搜索命令<enter>。在其他时候输入也会被输入,所以我们检查这是否是一个搜索,然后才执行该功能。

也可能有其他解决方案,但这个工作很好,我学到了一些新东西。谢谢!