Vim - 搜索和替换结果

16

我使用Vim已经有几个月了,越来越熟悉这个编辑器。

但是,有一个简单的功能却找不到网上的答案,那就是“查找和替换结果”。我知道:

输入“:/关键词”进行搜索,按下回车,“关键词”会被高亮显示(当然需要设置“set hlsearch”); 使用n或N进行导航;

输入“:% s/旧关键词/新关键词/g”则可以替换所有出现的旧关键词为新关键词。

但是,我认为一定有一种方法可以在不执行“:% s/旧关键词/新关键词/g”的情况下搜索并替换匹配的关键词(高亮显示)为任何新词。毕竟查找和替换是日常工作中很常见的功能,如果每次都要键入命令,那就太麻烦了。

非常感谢您提供任何答案或意见!

4个回答

33
如果您已经进行了搜索,您可以通过在替换命令中省略模式来对相同的模式进行替换。例如:
/keyword

搜索 "keyword",然后:

:%s//new_keyword/g

将会用"new_keyword"替换所有出现的"keyword"。


这很好...之前不知道可以使用空搜索字符串来进行先前的搜索。我想要补充的是,搜索和替换是如此频繁的操作,因此我会添加一些映射功能,以便自动完成,例如: nmap <Leader>f :%s/<<c-r>=expand("<cword>")<cr>>/ 这将会查找并替换光标当前所在的单词...你也可以有: nmap <Leader>F :%s// 用于你已经搜索到了某些内容的情况下。 - Neg_EV

3

在这里,搜索和使用点命令(您没有提到您正在使用点命令,这就是我突出显示的原因)来重复上一次输入操作是最好的选择。

我使用 s///g 进行搜索和替换。


谢谢,Ronny。虽然这对我来说不是一个高效的通用解决方案,但它提醒了我一个重要的 Vim 命令“.”。干杯! - Khiet

3

由于#keyword#和#new_keyword#占据了大部分字符,并且您需要一些方法来区分它们(例如,vim中的一个字符,或者在不同编辑器中对话框中的输入字段之间进行切换),因此您可能只剩下四到五个按键。

因此,我认为您可能高估了按键数,并且忘记了(1)它变得非常自然,以及(2)通过指定不同的范围或选项标志,也可以自然地修改执行的操作。

但是您可以减少按键次数。如果您想要,可以将一个键映射到自动打开命令行并已经输入'%s/'。例如:

nmap s :%s/

上面的命令将重新映射's'键(我不推荐重新映射该键,但这给出了想法),并设置您插入关键字的方式。
此外,您可以将'gdefault'选项设置为默认替换每行多次。这使您可以跳过您的按键中的结尾'/g'。
set gdefault

请参阅 ':h gdefault' 获取有关该选项的帮助部分。

最后,我想说只需习惯默认工作方式,因为以这种方式使用它可以使您在指定不同范围或选项标志时保持相同的基本操作,并创建新的特殊映射只是要记住的另一件事。如果您认为大多数时间都需要它,则可以设置gdefault,当设置了gdefault时,在末尾添加/g标志的效果是关闭/g。. . .


非常感谢Herbert,提供了许多有用的信息和技巧。特别是,我发现set gdefault和/g动态取消设置非常美妙,否则我不会知道。干杯!!! - Khiet

1

移动到第一个高亮单词,然后记录一个宏来替换该单词并移动到下一个单词,例如:

gg
n
qq
caw 新单词^[
n
q
@q
@@
@@
...

@meagar:没错,但问题不是如何用最少的按键来做,而是如何在不使用:%s命令的情况下完成。 - Cercerilla
@meagar:当你可以只需按“.”来继续执行相同的操作时,就不需要这样做了。 - Greg Hewgill
@Codeninja 他不是在问如何在没有 :%s 的情况下完成它,而是在问如何使用 :%s 完成它,但又不必重新输入关键字。 - user229044
@Greg 如果有1000个匹配需要替换怎么办? - user229044
我偶尔会使用 ncw...n.n.n.(等) 这样的快捷键,当我知道只有几个替换而且感觉非常懒的时候。我使用宏的最接近情况是当我需要替换更加复杂的内容时。例如:在每个 bar 出现之后第一次出现的 foo(其中 foo 和 bar 在不同的行上)替换为 baz。这就是宏录制非常方便的地方:qq/bar<cr>/foo<cr>cwbaz<esc>q9999@q - Laurence Gonsalves
显示剩余3条评论

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