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

54 vim

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

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

小智 79

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

尝试此搜索并替换:

:%S /富/酒吧/ GC

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

按y或n更改或保留文本.

  • 诀窍是让bar为空:%s/foo // gc (34认同)

ghb*_*att 35

我有三种方法可以想到:

最容易解释的方法是

:%s/phrase to delete//gc
Run Code Online (Sandbox Code Playgroud)

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

/phrase to delete
Run Code Online (Sandbox Code Playgroud)

Vim会带你到下一个短语的开头.

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

删除所有短语后点击转义.

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

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

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

计算要删除的字符数

输入该号码(带数字键)

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

像第二种方法一样继续使用n和dot.

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

  • @chown是但是使用x计数作为单个命令,所以如果你想通过点击点来删除整个短语,那么你必须进入插入模式并删除字符数量.但你可以计算要删除的字符数,键入该数字,然后x - 我会将其添加到我的答案,感谢灵感,如果不是建议. (3认同)
  • 为什么不使用d(删除)键进行删除?因为这个短语一直是相同的,所以在d之后使用动作键来删除(dw用于删除单词,dt'用于将所有内容删除到下一个出现'),它仍将作为一个命令计算并使用. (3认同)

ib.*_*ib. 10

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

:%s///gc
Run Code Online (Sandbox Code Playgroud)

此命令用空字符串替换最后一个搜索模式(在省略模式时使用)的出现.

另外,可以定义文本对象选择映射以专门操作光标下的最后搜索模式的匹配.可以在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
Run Code Online (Sandbox Code Playgroud)

使用这些映射可以删除光标下的匹配di/,应用任何其他操作符或直观地选择它vi/.


Zaz*_*Zaz 6

最好的方法可能是使用:

:%s/phrase//gc
Run Code Online (Sandbox Code Playgroud)

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

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