在Vim中,是否可以交互式删除匹配的搜索模式?

80

我希望在Vim中查找一个短语,找到后,我想逐个删除该短语的每个实例。什么是最简单的方式来循环遍历所有出现的实例(通过 n),并逐个删除匹配项(我不想一次性删除所有匹配项)。

注意:我知道我可以删除一定数量的字符或单词,但我想要特定删除我的搜索匹配项。这可能吗?

4个回答

118

1
我该如何将"./"替换为""? 我想把"./labeled-data/moth/frame051.png"转换成"labeled-data/moth/frame051.png"。 - Mona Jalal
1
@MonaJalal 试试这个,对我有用::%s/\.\///g点和斜杠需要在前面加上反斜杠才能将它们视为字面字符。 - Dan Spiteri
哇。。这太有用了。 - Vinn

47

我能想到三种方法:

其中最容易解释的方式是

:%s/phrase to delete//gc

但你也可以(个人更常用这种方法)使用常规搜索删除该短语。

/phrase to delete

Vim会带你到下一个短语出现的开头。

进入插入模式(按i键),使用删除键删除短语。

在删除所有短语后按Esc键。

现在你已经做了一次,可以按n前往下一个出现的短语,然后按“.”键执行刚才执行的删除操作。

继续按n和点号直到完成为止。

最后,您可以搜索要删除的短语(就像第二种方法中那样),但这次不需要进入插入模式,而是:

计算要删除的字符数

用数字键输入该数字

按x键-字符应该被删除

像第二种方法那样继续进行n和点号操作。

PS- 如果你还不知道,你可以使用大写N向后移动搜索匹配项。


1
不必进入插入模式,然后按删除键,再按Esc键,你可以通过直接使用“x”键来删除光标下的字符,从而节省大约4个按键。 - chown
4
@chown 是的,但使用 x 命令算作单个命令,因此如果你想通过按下句点来删除整个短语,那么你必须进入插入模式并删除相应数量的字符。不过,你可以计算要删除的字符数,键入该数字,然后使用 x 命令。我会将这部分添加到我的答案中,感谢你的启发,即使不是建议。 - ghbarratt
5
为什么不使用d键进行删除?由于这个短语总是相同的,因此可以通过在d之后使用运动键来删除(例如dw表示删除单词,dt'表示删除到下一个'的出现为止),这仍然算作一个命令,并且适用于“.”。 - Sedrik
1
@Sedrik +1 那绝对是要提到的一组好命令。 - ghbarratt
%s/word 删除该单词。如果该单词在当前行中,则省略 %% 表示(搜索整个)文件,默认情况下(范围)为行。 - user4104817

15

1. 我认为最方便的方法是首先查找一个实例,然后调用以下:substitute命令:

:%s///gc

由于模式为空,这个:substitute命令将查找上次使用的搜索模式的出现次数,然后用空字符串替换它们,每次都会要求用户确认,实现了完全期望的行为。

2. 如果这是一个人编辑习惯中常见的模式,则可以进一步定义几个文本对象选择映射,以针对光标下最后一个搜索模式的匹配进行操作。以下两个映射可在Visual和Operator-pending模式下使用,以选择上一个匹配项的文本:

vnoremap <silent> i/ :<c-u>call SelectMatch()<cr>
onoremap <silent> i/ :call SelectMatch()<cr>
function! SelectMatch()
    if search(@/, 'bcW')
        norm! v
        call search(@/, 'ceW')
    else
        norm! gv
    endif
endfunction

使用这些映射,你可以通过di/删除光标下的匹配项,或者使用vi/对其进行任何其他操作或可视化选择。


12

最好的方法可能是使用:

:%s/phrase//gc

c 在每次删除前要求确认。 g 允许在同一行上进行多个替换。

您也可以使用 /phrase 进行搜索,使用 gn 选择下一个匹配项,并使用 d 进行删除。


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