私はファイルとその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
。
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")