例如,我有一些代码并使用“*”在该代码中搜索某些内容。在该文件中未找到所需内容后,我想使用类似于
ack
或grep
的工具在本地目录中搜索。我知道可以使用:! ack whatever
在vim内进行搜索,但我想知道是否有一种方法可以在vim中用当前搜索的单词替换whatever
。:!grep <Ctrl-r> / file_list
*
搜索命令始终包括单词边界。g*
搜索命令的行为与 *
相同,但不包括单词边界。cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '')
CTRL-R /
时,它将删除单词边界标记,因此您应该能够使用以下命令::!grep CTRL-R / file-list
cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '') <CR>
- Paul Wicksg*
搜索命令而不是*
。有关详细信息,请参阅我的更新答案:https://dev59.com/KE3Sa4cB1Zd3GeqPvn9f#2739223 - Tim Heniganctrl-r
后跟着 /
,会插入搜索寄存器中的文本,但如果你按下 ctrl-r
后跟着键盘上的任何字母,它将插入相应寄存器的内容。除了字母外,还有其他特殊寄存器,例如 .
(最后输入的文本)、%
(当前文件名)等。通过重新映射 ctrl-r
,您将无法使用这些各种寄存器构建的潜在有用快捷方式。 - nelstromCTRL-R
,我正在重新映射 CTRL-R /
。所有其他的 CTRL-R
命令仍然有效。 - rampion我还没有找到一种简单的方法来将搜索寄存器的内容传递给外部程序,而不需要使用键映射和eval语句。
但是,您可以使用<cword>
将当前光标下的单词传递给外部程序:
:!echo <cword>
或者
:!ack <cword>
:! echo @/
),但是echo的输出文字确实字面上的'@/'。 - Tim Henigan:echo @/
将会显示 /
寄存器的内容... - John Weldon您可以将单词移动到寄存器中,然后在命令模式行中使用@regnum。
"1yw :!grep @1
*
结合使用时,它也具有单词边界。有没有办法去掉它们? - Paul Wicks*
搜索设置了搜索模式,以包括单词边界。因此,您不能使用*
来获取不带单词边界的模式。 - Tim Henigang*
搜索命令的内容。 - Tim Henigan