我希望在Vim中查找一个短语,找到后,我想逐个删除该短语的每个实例。什么是最简单的方式来循环遍历所有出现的实例(通过 n
),并逐个删除匹配项(我不想一次性删除所有匹配项)。
注意:我知道我可以删除一定数量的字符或单词,但我想要特定删除我的搜索匹配项。这可能吗?
我希望在Vim中查找一个短语,找到后,我想逐个删除该短语的每个实例。什么是最简单的方式来循环遍历所有出现的实例(通过 n
),并逐个删除匹配项(我不想一次性删除所有匹配项)。
注意:我知道我可以删除一定数量的字符或单词,但我想要特定删除我的搜索匹配项。这可能吗?
http://vim.wikia.com/wiki/Search_and_replace
尝试使用这种搜索和替换方法:
:%s/foo/bar/gc
将每个'foo'更改为'bar',但先要求确认。
按y或n以更改或保留您的文本。
我能想到三种方法:
其中最容易解释的方式是
:%s/phrase to delete//gc
但你也可以(个人更常用这种方法)使用常规搜索删除该短语。
/phrase to delete
Vim会带你到下一个短语出现的开头。
进入插入模式(按i键),使用删除键删除短语。
在删除所有短语后按Esc键。
现在你已经做了一次,可以按n前往下一个出现的短语,然后按“.”键执行刚才执行的删除操作。
继续按n和点号直到完成为止。
最后,您可以搜索要删除的短语(就像第二种方法中那样),但这次不需要进入插入模式,而是:
计算要删除的字符数
用数字键输入该数字
按x键-字符应该被删除
像第二种方法那样继续进行n和点号操作。
PS- 如果你还不知道,你可以使用大写N向后移动搜索匹配项。
%s/word
删除该单词。如果该单词在当前行中,则省略 %
。%
表示(搜索整个)文件,默认情况下(范围)为行。 - user41048171. 我认为最方便的方法是首先查找一个实例,然后调用以下: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/
对其进行任何其他操作或可视化选择。
最好的方法可能是使用:
:%s/phrase//gc
c
在每次删除前要求确认。 g
允许在同一行上进行多个替换。
您也可以使用 /phrase
进行搜索,使用 gn
选择下一个匹配项,并使用 d
进行删除。
:%s/\.\///g
点和斜杠需要在前面加上反斜杠才能将它们视为字面字符。 - Dan Spiteri