Vim搜索和替换选定文本

149

假设我们有一段文本,我进入了视觉模式并选择了一些文本。如何快速搜索高亮显示的文本并将其替换为其他内容?


1
这个问题展示了vim最令人沮丧的缺陷之一。在任何图形编辑器中,这项工作可以在几秒钟内完成。但正如所有提供的答案所显示的那样,在我们让vim执行相同操作之前,我们必须跳过许多障碍。 - user9224371
15个回答

2
这是对Mykola的答案的一种变体。我喜欢从当前行到文本末尾进行替换,然后从开头到当前行进行替换(基本上循环从当前行开始而不是从开头开始)。
vnoremap <C-r> "hy:.,$s/<C-r>h//gc \|1,.&& <left><left><left><left><left><left><left><left><left><left><left>

首先,从当前行到文本末尾进行替换.,$,然后从开头到当前行重复替换\|1,.&&。11个<left>将光标放在正确的位置。


2

我认为你不能直接做到这一点。但很多人喜欢这个功能,所以有很多宏等工具(我自己也添加了)。这里是一个例子,你可以添加它;只需按下*键即可在视觉上选择的文本中搜索下一个匹配项。


1
例子1. 使用星号选择引用,将光标保持在选择的开头。
:%s,\%#\%V\_.*\%V/,**&**,c 

例子2. 使用Base64管道选择的文本:
:%s!\%#\%V\_.*\%V!\=system("base64 -w 0",@")!c

解释 LHS:
\%# matches cursor 
\%V matches inside the selection only
\_. matches any character.
\_.* matches beginning to end of selection.

解释 RHS:

\=expr()  Replace match with result of expr() for each substitution.

1

我没有足够的声望来评论,所以我正在添加另一个答案...

vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>

@dmd 和 @dotancohen:对我而言,这个方法可行,而且不需要使用 "h(显式地使用 0,因为它已经是最后一次复制的位置),并且可以在 putty ssh -> mint (lmde) 上工作;不知道 cent。还使用了 @Niloct 和 @Nathan Friend 的评论来消除确认。


1

我最喜欢的简短版本是:

vnoremap s/ y:s/" /

然后你可以选择文本并按s/,就可以开始替换命令了。


1
对我没用,将 " 视为文字处理。但 <c-r>" 可以使用。 - Josh Bodah

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