我喜欢打开文件及其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")