在VIM中删除匹配的搜索模式

时间:2011-10-20 21:14:03

标签: vim

我想在VIM中查找一个短语。找到后,我想删除这个短语。什么是循环到所有实例(n)的最简单方法,并逐个删除匹配(我不想删除所有实例)。

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

4 个答案:

答案 0 :(得分:71)

http://vim.wikia.com/wiki/Search_and_replace

尝试此搜索并替换:

<强>:%S /富/酒吧/ GC

将每个'foo'更改为'bar',但首先要求确认。

按y或n更改或保留文字。

答案 1 :(得分:29)

我有三种方法可以想到:

最容易解释的方式是

:%s/phrase to delete//gc

但你也可以(我个人经常使用第二个)定期搜索要删除的短语

/phrase to delete

Vim会将您带到下一个短语的开头。

进入插入模式(点击i)并使用Delete键删除短语。

删除所有短语时点击转义。

既然你已经完成了这一次,你可以点击n转到下一个短语,然后点击点/句号“。”用于执行刚刚执行的删除操作的键

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

最后你可以搜索要删除的短语(比如在第二种方法中),但是这一次,而不是进入插入模式,你

计算要删除的字符数

在(使用数字键)

中键入该数字

点击x键 - 字符应该被删除

在第二种方法中继续使用n和dot。

PS - 如果您还不知道,您可以通过搜索匹配向后移动资金n。

答案 2 :(得分:10)

一个简单的解决方案是使用:substitute命令 确认:

:%s///gc

此命令替换最后一个搜索模式的出现(如果使用,则使用该模式 带有空字符串的模式被省略。

此外,可以定义要操作的文本对象选择映射 特别是在光标下最后一个搜索模式的匹配上。该 以下两个映射可以在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/直观地选择它。

答案 3 :(得分:3)

最好的方法是使用:

:%s/phrase//gc

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

您也可以使用/phrase进行搜索,选择与gn匹配的下一个匹配项,然后使用d将其删除。