我想在VIM中查找一个短语。找到后,我想删除这个短语。什么是循环到所有实例(n
)的最简单方法,并逐个删除匹配(我不想删除所有实例)。
注意:我知道我可以删除一定数量的字符或一些单词,但我想专门删除搜索的“匹配”。这可能吗?
答案 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模式下使用 从上次搜索的上一个匹配开始选择文本 模式到底。 p>
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
将其删除。