O comando vimgrep
requer um argumento de arquivo baseado na ajuda:
: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.
Quando você tentar usá-lo como em seu exemplo printf ... | vim -
, o erro informará o mesmo:
E499: Empty file name for '%' or '#', only works with ":p:h"
O %
é uma notação abreviada para qualquer arquivo que você tenha aberto em vim
. Dado que não há arquivo quando a tubulação via STDIN, você não pode fazer o que quiser.
Ao pesquisar por vim
, há basicamente três métodos:
- : vimgrep
- : grep
- /
vimgrep
destina-se a fazer grepping de arquivos de vim
. Você usa :grep
para invocar a versão do sistema de grep
para pesquisar arquivos locais ou dentro do diretório de onde você chamou vim
. O / serve para fazer pesquisas dentro do buffer atual em que você está ativamente dentro de vim
.
Esta terceira opção seria a apropriada para usar no cenário em que você está procurando em um buffer preenchido com conteúdo via STDIN.
descritor de arquivo temporário
Como alternativa, você pode obter o shell para criar um descritor de arquivo temporário criando um temporário e enviando o conteúdo via STDIN a partir desse descritor de arquivo temporário:
$ vim <(...)
Você pode ver isso assim:
$ ls -l <(echo hi)
lr-x------ 1 root root 64 Aug 2 22:15 /dev/fd/63 -> pipe:[738943]
Assim, você pode enganar vim
acreditando que o conteúdo está vindo de um arquivo usando a subshell <(..)
acima, em vez de enviar os dados via STDIN da seguinte forma:
$ vim <(...cmds...)