如何在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