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...)