2014-02-06 40 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>。在其他時候輸入也會被輸入,所以我們檢查這是否是一個搜索,然後才執行該功能。

也可能有其他解決方案,但這個工作很好,我學到了一些新東西。謝謝!