STDINファイルのvimgrep?

STDINファイルのvimgrep?

私はファイルとそのgrep内容を開きたいです:

$ vim file
:vimgrep PATTERN %
:cwin

(set mouse=a)これで、クリックして結果を切り替えることができる素晴らしいバッファができました。

ただし、これはSTDIN入力には適用されません。たとえば、

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

空のファイル名エラーが発生します。

vimgrepSTDINまたは同等の機能をどのように使用しますか?

答え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

3番目のオプションは、STDINを介してコンテンツで埋められたバッファから取得するシナリオに適しています。

一時ファイル記述子

あるいは、一時ファイル記述子を生成して、シェルが一時ファイル記述子を生成し、STDIN を介してその一時ファイル記述子の内容を送信できるようにすることもできます。

$ vim <(...)

次のように表示できます。

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

したがって、次のように、上記のサブシェルを使用してSTDINを介してデータを送信するのではなく、コンテンツがファイルから来たように信じるvimようにコンテンツをだますことができます.<(..)

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

引用する

答え2

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

関連情報