2010-04-29 51 views
4

例如,我有一些代碼,我使用「*」在該代碼內搜索某些內容。在該文件中找不到我想要的內容,我想使用類似ackgrep的內容在本地目錄中進行搜索。我知道我可以在vim中做:! ack whatever來做搜索,但是我想知道的是有沒有辦法用vim中當前搜索到的單詞替換whatever如何在vim中檢索當前搜索到的文本?

回答

1

Riffing斷Tim Henigan's answer,把這個在你的.vimrc

cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '') 

現在,當你在命令行模式下打到CTRL-R /,它會掉落字boundry標記,所以你應該能夠使用

:!grep CTRL-R / file-list
+0

太棒了,這正是我所尋找的。我修改了一下你的映射,以避免必須按兩次回車鍵: 'cmap / = substitute(substitute(@ /''^ \\'','',''),'\\ > $','','')' – 2010-04-29 19:51:36

+0

另一種選擇是使用'g *'搜索命令而不是'*'。查看我更新的答案以獲取詳細信息:http://stackoverflow.com/questions/2739135/how-to-retrieve-the-currently-searched-for-text-in-vim/2739223#2739223 – 2010-04-29 20:11:10

+0

'ctrl-r'後面跟着'/'從搜索寄存器中插入文本,但是如果你在鍵盤上輸入任何字母后按'ctrl-r',它會插入相應寄存器的內容。除了字母之外,還有其他特殊的寄存器,例如'.'(最後輸入的文本),'%'(當前文件名)等。通過重新映射'ctrl-r',您可以鎖定所有可能的快捷鍵,由這些不同的寄存器構成。 – nelstrom 2010-04-29 22:05:42

0

,你可以抽出字到寄存器中,在命令行模式下使用@regnum

「1yw :grep的@ 1

+0

最後的搜索字符串已經在/ register – 2010-04-29 20:21:49

1

我還沒有找到一個辦法(容易)通搜索的內容註冊到一個外部程序,而不訴諸鍵映射和eval statmements

但是,您可以使用<cword>光標下通過這個字的外部程序。

:!echo <cword> 

:!ack <cword> 
+0

這對我在windows上使用vim 7.2不起作用。 – 2010-04-29 16:58:08

+0

是的,可能是因爲ack和grep不處理'\ <'和'\>'相同。 – 2010-04-29 17:00:24

+0

你可以這樣做:':!回聲@ /'看看你有什麼合作。 – 2010-04-29 17:01:13

4

您可以使用Ctrl-R跟/插入最後搜索寄存器。

:!grep <Ctrl-r>/file_list 

詳情參見本Vim Tips Wiki條目。

更新:
*搜索命令命令總是包含字邊界。

但是,g*搜索命令的行爲與*相同,但沒有字邊界。

這可以用於解決您的問題,而不是使用rampion's answer中的自定義宏。

+0

雖然與'*'結合使用,但它也有字面界限。無論如何,沒有他們的文本? – 2010-04-29 17:11:10

+0

「*」搜索設置搜索模式以包含單詞邊界。所以你不能使用'*'來獲取沒有它們的模式。 – 2010-04-29 17:17:02

+0

@Paul Wicks:查看我關於'g *'搜索命令的更新。 – 2010-04-29 20:10:24