在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