vimgrep 从 STDIN 文件中?

vimgrep 从 STDIN 文件中?

我喜欢打开文件及其grep内部:

$ vim file
:vimgrep PATTERN %
:cwin

现在我得到了一个很好的缓冲区,我可以单击它(set mouse=a)来在结果之间切换。

但是,这不适用于 STDIN 的输入。例如:

$ printf "hello\nworld\n" | vim - 
:vimgrep hello %

我收到空文件名错误。

我如何vimgrep或等效地使用 STDIN?

答案1

该命令vimgrep需要一个基于帮助的文件参数:

:vim[grep][!] {pattern} {file} ...
        Search for {pattern} in the files {file} ... and set
        the error list to the matches.  Files matching
        'wildignore' are ignored; files in 'suffixes' are
        searched last.

当您尝试将其与printf ... | vim -示例一起使用时,错误甚至会指出:

E499: '%' 或 '#' 为空文件名,仅适用于“:p:h”

%是您在 中打开的任何文件的简写符号vim。由于通过 STDIN 进行管道传输时没有文件,因此您无法执行您想要的操作。

通过搜索时,vim基本上有 3 种方法:

  • :vimgrep
  • :grep
  • /

vimgrep旨在从内部对文件进行 grep 操作vim。您可以:grep调用系统版本的 来grep搜索本地文件或在您调用的目录中搜索文件vim。这/是为了在您当前活跃的缓冲区内进行搜索vim

第三个选项适合您在通过 STDIN 填充内容的缓冲区中进行搜索的场景。

临时文件描述符

作为一种替代方法,您可以让 shell 通过创建临时文件描述符来创建临时文件描述符,并通过 STDIN 从该临时文件描述符发送内容:

$ vim <(...)

你可以这样看:

$ ls -l <(echo hi)
lr-x------ 1 root root 64 Aug  2 22:15 /dev/fd/63 -> pipe:[738943]

因此,您可以vim使用上面的子 shell 来欺骗相信内容来自文件,<(..)而不是通过 STDIN 发送数据,如下所示:

$ vim <(...cmds...)

参考

答案2

vim <(printf "hello\nworld\n")

相关内容