我想在 Vim 中寻找一个短语。找到后,我想删除该短语的出现。循环遍历所有匹配项(通过
n
)并逐一删除匹配项的最简单方法是什么(我不想一次删除所有匹配项)。
注意:我知道我可以删除一定数量的字符或一定数量的单词,但我想专门删除搜索的匹配项。这可能吗?
http://vim.wikia.com/wiki/Search_and_replace
尝试此搜索并替换:
:%s/foo/bar/gc
将每个“foo”更改为“bar”,但首先要求确认。
按 y 或 n 更改或保留文本。
我能想到3种方法:
最容易解释的方式是
:%s/phrase to delete//gc
但是您也可以(我个人更频繁地使用第二个)定期搜索要删除的短语
/phrase to delete
Vim 会将您带到该短语下一次出现的开头。
进入插入模式(按 i)并使用删除键删除短语。
删除所有短语后按“退出”。
现在您已经完成了一次此操作,您可以按 n 转到该短语的下一个出现位置,然后按点/句点“。”键执行您刚刚执行的删除操作
继续按 n 和点,直到完成。
最后,您可以搜索要删除的短语(如第二种方法),但这一次,您不是进入插入模式,而是
计算要删除的字符数
输入该数字(使用数字键)
按 x 键 - 字符应该被删除
像第二种方法一样继续使用 n 和点。
PS - 如果您还不知道,您可以使用大写 n 在搜索匹配项中向后移动。
1. 在我看来,最方便的方法就是搜索一个 首先发生,然后调用以下
:substitute
命令:
:%s///gc
由于模式为空,此
:substitute
命令将查找
最后使用的搜索模式的出现,然后将替换
它们带有空字符串,每次都要求用户确认,
准确地实现所需的行为。
2. 如果这是一个人编辑习惯中的常见模式,则可以 进一步定义几个文本对象选择映射来操作 特别是在光标下最后一个搜索模式的匹配上。 以下两个映射可用于 Visual 和 用于选择前一个匹配文本的运算符挂起模式 最后的搜索模式。
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
将其删除。
这个问题仍然缺少一个很好的技术,所以我将在这里添加它。执行搜索后:
gn
以在 VISUAL 模式下选择下一个搜索匹配项。d
以删除该视觉选择。dgn
删除后续匹配项,或输入 n
在匹配项之间跳转/跳过。.
可删除每个连续的匹配项。好处是,正如您所要求的那样,您可以使用
n
循环浏览您的比赛,让您有机会查看每个匹配项并跳过您想要保留的匹配项。然后点击 .
删除当前光标正下方的下一个匹配项。这也让您有机会在点击 .
之前/之后目视检查差异,我经常发现这也很有帮助。
您所缺少的可能只是
gn
。当然,您可以在 gn
前面添加其他命令,例如 cgn
,因此这是一种非常可组合的方法。