如何在vim中检索当前搜索的文本?

如何在vim中检索当前搜索的文本?,vim,vi,Vim,Vi,例如,我有一些代码,我使用“*”搜索代码中的某些内容。没有在该文件中找到我想要的内容,我想使用类似于ack或grep的内容在本地目录中搜索它。我知道我能做到:!确认从vim中执行搜索的任何内容,但我想知道的是,有没有一种方法可以将当前在vim中搜索的单词替换为任何内容。您可以将该单词拉入寄存器,并在命令模式行中使用@regnum “1yw :!grep@1我没有找到一种方法(轻松地)将搜索寄存器的内容传递给外部程序,而不借助键映射和求值语句 但是,您可以使用将光标下的当前单词传递给外部程序: :

例如,我有一些代码,我使用“*”搜索代码中的某些内容。没有在该文件中找到我想要的内容,我想使用类似于
ack
grep
的内容在本地目录中搜索它。我知道我能做到
:!确认从vim中执行搜索的任何内容,但我想知道的是,有没有一种方法可以将当前在vim中搜索的单词替换为
任何内容。

您可以将该单词拉入寄存器,并在命令模式行中使用@regnum

“1yw :!grep@1

我没有找到一种方法(轻松地)将搜索寄存器的内容传递给外部程序,而不借助键映射和求值语句

但是,您可以使用
将光标下的当前单词传递给外部程序:

:!echo <cword>
:!echo

:!确认

您可以使用Ctrl-r后跟/插入最后一个搜索寄存器

:!grep <Ctrl-r> / file_list
:!grep/file\u列表
有关更多信息,请参阅此条目

更新:
*
搜索命令始终包含单词边界

但是,
g*
搜索命令的行为与
*
相同,但没有单词边界

这可以用来解决您的问题,而不是在中使用自定义宏。

在中,将其放入.vimrc

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

我就是这么做的(
:!echo@/
),但echo的输出是字面上的“@/”。无论如何,要获得文本,没有单词边界?@Tim Henigan,我的错误,
:echo@/
将向您显示
/
寄存器的内容…这是有效的,尽管与
*
结合使用时,它也有单词边界。是否仍然可以获得没有单词边界的文本e
*
search将搜索模式设置为包含单词边界。因此,您不能使用
*
来获取没有边界的模式。@Paul Wicks:请参阅我关于
g*
search命令的更新。太棒了,这正是我要查找的。我确实对您的映射进行了一些修改,以避免必须按两次enter键:
cmap/=substitute(substitute(@/,“^\\\$”,“,”)
另一个选项是使用
g*
搜索命令,而不是
*
。有关详细信息,请参阅我的更新答案:
ctrl-r
后跟
/
插入搜索寄存器中的文本,但如果要执行
ctrl-r
操作,然后在键盘上键入任何字母,则会插入相应的内容除字母外,还有其他特殊的寄存器,如
(最后输入的文本)、
%
(当前文件名)等。通过重新映射
ctrl-r
可以锁定所有可能有用的快捷方式,这些快捷方式可以从这些不同的寄存器中构造出来。@nelstrom:我不是重新映射
ctrl-r
,我是重新映射
ctrl-r/
。所有其他
ctrl-r
命令仍然有效。
cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '')
:!grep CTRL-R / file-list