89

是否可以在 vi 或 Vim 中显示/隐藏所有匹配的行?不突出显示,只显示那些行。

例如,我有一个带有 word the word 的文本ERROR。如何使其仅显示包含的行ERROR以及如何仅显示不包含的行ERROR

没有删除所有匹配行然后撤消它的解决方案?

4

8 回答 8

112

你知道:global命令吗?这是做你想做的吗?

:g/ERROR

相反:

:g!/Error

或等效地:

:v/Error
于 2009-05-14T12:14:37.027 回答
54

根据您的用例,另一种方法是使用vimgrep及其结果在quickfix。您可以执行以下操作:

:vimgrep pattern %将搜索当前文件并将您带到第一个搜索结果。更重要的是,它还将结果放在“快速修复列表”中。

:copen然后将在单独的快速修复窗口中打开快速修复列表。因此,您将有一个单独的窗口,其中包含上次 vimgrep 中的所有行。在快速修复窗口中,您可以按 Enter 或双击一行以跳转到原始文件中的相应行。

:colder会让你回到旧的 quickfix 列表(旧的 vimgrep 结果)。并:cnewer前进到更新的搜索结果。

请注意,quickfix 列表在运行时也会更新:make(这就是为什么它被称为 quickfix 来修复错误)。正因为如此,quickfix 列表还有一个替代品,称为“位置列表”。要使用它,请使用:lvimgrep,然后使用 l 前缀命令而不是 c 前缀命令 - :lopen, :lolder, :lnewer.

当然,您可以做的还有很多。有关:help quickfix更多信息,请参阅。

PS,您说您不想要一种删除行然后撤消它们的方法。但是既然你标记g/ERROR为答案,我想我会指出一个快速而肮脏的方法是做g!/ERROR/d。然后,您可以使用 轻松撤消它u。另外仅供参考,您可以:set hlsearch突出显示与:g命令匹配的模式。

于 2012-09-18T23:26:43.267 回答
39

您可以使用

:g/ERROR/

打印所有带有 ERROR 的行

还有一个我看过很多次但没有使用的 Vim 插件: foldsearch : fold away 与给定模式不匹配的行

于 2009-05-14T12:13:18.170 回答
27

最好的方法是->

:vimgrep /something/g % | copen

这将打开您的关键字的匹配列表,并且还将在快速修复窗口中仅显示匹配的行。

如果不考虑当前文件,则将 % 替换为文件路径。

于 2015-09-06T07:11:56.517 回答
2

:vimgrep /something/g % | copen效果很棒。也:g/<pattern>/d可用于删除带有图案的线条

于 2018-10-12T18:25:12.970 回答
2

如果你碰巧使用fzf你可以使用:

  • :Lines在所有打开的文件中
  • :BLines仅在开放缓冲区中
  • :Rg [pattern]使用ripgrep
于 2019-07-24T12:01:16.157 回答
1

一些hackish肮脏的方式来做到这一点:

:w (save)
ggdG (deletes everything)
:.!grep something % (replace current line with grep output)
于 2020-01-09T14:19:24.300 回答
0

您可能指的是 less vi vim & /pattern/ 中的命令,它显示包含 /pattern/ 的行(如 grep)。

于 2015-05-28T07:26:45.803 回答