在Vim中,与Emacs的“Ctrl+s Ctrl+w”相当的操作是什么?

4

我用emacs有一段时间了,现在开始尝试使用Vim。在emacs中,若要选择搜索缓冲区中的多个单词,我会将光标移动到感兴趣的单词开头,然后按下“Ctrl+s”以启动搜索模式。接着我会按下Ctrl+w逐步选择要搜索的单词,最后再次按下Ctrl+s来搜索已选择的文本。

Vim中的等效方法是什么? 我了解到,在vim中使用*可以搜索光标下的单词。但是如果我想搜索不止一个词怎么办?比如光标后面的2个单词。

2个回答

7

Vim的最接近相似功能

Vim没有直接相等的功能,但这里有一种方法可以达到相同的效果。这种方法比在Emacs中多按四次按键。

假设这是您的文档,光标位于[]之间:

I have [s]ome text.
Will I find some text?
Yes. Some people can find text, and I can find some text.

您想搜索“一些文本”。在Emacs中,您需要键入四个按键C-s C-w C-w C-s。以下是在Vim中键入的内容:v e e y / <C-R> " <CR>
逐个按键的说明:
每个按键下面都有一个链接,指向该命令的文档。
  • v – 进入Visual模式,选择当前字符“s”
  • ee – 向前移动两个单词,选择短语“some text”
  • y – 复制该文本到默认寄存器,即未命名寄存器"
  • / – 开始搜索;提示输入搜索词
  • <C-R>" – 将刚刚复制的未命名寄存器 "的内容插入到命令行中。(<C-R>表示Control+R)
  • <CR> – 执行搜索。(<CR>是回车符,用EnterReturn键输入。)

改进此解决方案

如果您不需要所选内容的可视反馈,并且已经知道需要选择多少个单词,则可以通过运动而非可视模式选择并插入,从而节省按键次数。在这种情况下,您将使用y 2 e替换veey,它的意思是“从光标到第二个下一个单词的末尾复制所有内容”。

如果搜索词包含标点符号,则上述指令可能无法正确搜索,因为标点符号可能被解释为正则表达式搜索。为了避免这种情况,在键入/后面写入\V(“非魔术字符”),它表示将模式中它后面的所有字符都按照字面意义进行处理(除了反斜杠)。我发现\V非常有用,所以我在我的.vimrc中放置自定义映射,以便默认情况下使用/进行文字搜索。

一个自定义映射使操作更加简单

对当前可视选择内容进行搜索是v_*映射的一个很好的应用(意思是在可视模式下使用*)。默认情况下,v_*的行为与*相同,但我从未觉得v_*的行为有帮助。

以下是您可以放置在您的 .vimrc 文件中的一对自定义映射,用于 v_* 和 v_#。它们允许您按字面意义向前或向后搜索可视选定的文本:
xnoremap * y/\V<C-R>"<CR>
xnoremap # y?\V<C-R>"<CR>

使用这些映射,在我的上面的示例中搜索“some text”,您只需要按下v e e *即可。
如果您想使此映射更加强大,可以扩展它以调用一个函数,该函数检查选择是否停在单词边界,并在左右两端添加单词边界搜索字符\<\>。您还可以使函数检查并转义反斜杠和正斜杠,以便包含这些内容的搜索术语始终有效。

谢谢您如此详细的回答!这太棒了 :):) - nogeek001

3
我经常使用那个插件,它允许你在视觉模式下使用*。这是链接: https://github.com/thinca/vim-visualstar
有了它,你在emacs中的^S^W^W^W^S序列在Vim中将变成veee*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接