vimgrep no arquivo de STDIN?

1

Eu gosto de abrir arquivos e grep dentro:

$ vim file
:vimgrep PATTERN %
:cwin

Agora eu recebo um bom buffer que eu posso clicar em (set mouse=a) para ir entre os resultados.

No entanto, isso não funciona com a entrada de STDIN. Por exemplo:

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

Eu recebo um erro de nome de arquivo vazio.

Como faço para vimgrep ou equivalente para STDIN?

    
por Leo Ufimtsev 03.08.2018 / 01:20

2 respostas

2

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

Referências

por 03.08.2018 / 02:38
1
vim <(printf "hello\nworld\n")
    
por 03.08.2018 / 02:42

Tags