是否可以在 Vim 中交互删除匹配的搜索模式?

问题描述 投票:0回答:5

我想在 Vim 中寻找一个短语。找到后,我想删除该短语的出现。循环遍历所有匹配项(通过

n
)并逐一删除匹配项的最简单方法是什么(我不想一次删除所有匹配项)。

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

vim
5个回答
119
投票

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

尝试此搜索并替换:

:%s/foo/bar/gc

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

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


47
投票

我能想到3种方法:

最容易解释的方式是

:%s/phrase to delete//gc

但是您也可以(我个人更频繁地使用第二个)定期搜索要删除的短语

/phrase to delete

Vim 会将您带到该短语下一次出现的开头。

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

删除所有短语后按“退出”。

现在您已经完成了一次此操作,您可以按 n 转到该短语的下一个出现位置,然后按点/句点“。”键执行您刚刚执行的删除操作

继续按 n 和点,直到完成。

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

计算要删除的字符数

输入该数字(使用数字键)

按 x 键 - 字符应该被删除

像第二种方法一样继续使用 n 和点。

PS - 如果您还不知道,您可以使用大写 n 在搜索匹配项中向后移动。


16
投票

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/
目视选择它。


12
投票

最好的方法可能是使用:

:%s/phrase//gc

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

您也可以仅使用

/phrase
搜索,使用
gn
选择下一个匹配项,然后使用
d
将其删除。


0
投票

这个问题仍然缺少一个很好的技术,所以我将在这里添加它。执行搜索后:

  • 输入
    gn
    以在 VISUAL 模式下选择下一个搜索匹配项。
  • 输入
    d
    以删除该视觉选择。
  • 输入
    dgn
    删除后续匹配项,或输入
    n
    在匹配项之间跳转/跳过。
  • 输入
    .
    可删除每个连续的匹配项。

好处是,正如您所要求的那样,您可以使用

n
循环浏览您的比赛,让您有机会查看每个匹配项并跳过您想要保留的匹配项。然后点击
.
删除当前光标正下方的下一个匹配项。这也让您有机会在点击
.
之前/之后目视检查差异,我经常发现这也很有帮助。

您所缺少的可能只是

gn
。当然,您可以在
gn
前面添加其他命令,例如
cgn
,因此这是一种非常可组合的方法。

© www.soinside.com 2019 - 2024. All rights reserved.