在vim中显示所有匹配某个模式的行

4
我想在vim中查找文件中的特定字符串,并希望显示所有包含匹配字符串的行,可能在另一个vim窗口中显示。
目前我是这样做的:
搜索“string”
/string

并移动到下一个匹配的字符串。
n or N

但是,我希望所有包含匹配字符串的行都在同一个位置显示。

例如:

1 这里有一个字符串

2 这里什么也没有

3 这里也有相同的字符串

我希望将第1和第3行显示为下面这样,并突出显示字符串

1 这里有一个字符串

3 这里也有相同的字符串


请查看CtrlSF - Sato Katsura
3个回答

9
:g/pattern/#<CR>

列出所有与pattern匹配的行。然后您可以执行:23<CR>跳转到第23行。

:ilist pattern<CR>

这是一种过滤评论并适用于包含文件的替代方法。

下面的命令:

:vimgrep pattern %|cwindow<CR>

将使用Vim内置的类似grep的功能,在当前文件(%)中搜索pattern,并在快速修复窗口中显示结果。

:grep pattern %|cwindow<CR>

这里介绍一个使用外部程序来实现相同功能的方法。需要注意的是,:grep:vimgrep 是针对文件而非缓冲区。

参考资料:

:help :g
:help include-search
:help :vimgrep
:help :grep
:help :cwindow

值得一提的是,我的插件vim-qlist结合了:ilist的特点以及快速修复窗口的功能。


3

根据评论,我认为您的文件是这样的,即行号不是文本的一部分:

Here is a string
Nothing here
Here is the same string

你可以将匹配某个模式的所有行复制到一个命名寄存器(在下面的示例中为“a”),然后将其粘贴到一个新文件中:

:g/string/y A
:e newfile
:"ap

这会得到你:

Here is a string
Here is the same string

或者,您可以使用grep命令并添加-n来包括行号:

:grep -n string %

1:~/tmp.txt [text]                          line: 3 of 3, col: 23 (All)
:!grep -nH -n string /home/christofer/tmp.txt 2>&1| tee /tmp/vHg7GcV/3
[No write since last change]
/home/christofer/tmp.txt:1:Here is a string
/home/christofer/tmp.txt:3:Here is the same string
(1 of 2): Here is a string
Press ENTER or type command to continue

默认情况下,您将在底部的“命令缓冲区”(不知道它的正确名称)中获得输出,但是您可以使用:copen将其存储在几个不同的位置

1
我以为这些行是文本的一部分。如果你在使用Linux,你可以在缓冲区上调用 grep -n 命令,该命令会给出行号。我也会尝试提供一个示例。 - Backlin
我在Windows上使用gVim。 - Sagar Jain
我读了一些资料,发现 grep 命令在 Vim 中实现,并且也应该可以在 Windows 上使用。最初我考虑调用 :! grep -n string %,它使用操作系统的 grep(在我的情况下是 Ubuntu),但你也可以省略 !,改用 Vim 的 grep - Backlin

1

根据Vi StackExchange上的这个回答:

:v/mystring/d

这将删除所有不包含mystring的行,并在剩余的行中突出显示mystring


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接