2010-04-29 142 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