Canalize a saída do comando shell (!) Em um novo buffer no Vim

35

Como canalizar a saída de um comando shell para um novo buffer no Vim? Obviamente, o seguinte não funcionaria, mas você pode ver no que estou falando:

:!echo % | :newtab
Richie Marquez
fonte
11
stackoverflow.com/questions/3826003/…
Ciro Santilli escreveu

Respostas:

27

Você não pode canalizar a saída de um comando do shell para um comando que cria um novo buffer, mas pode criar um novo buffer e ler a saída de um comando do shell para esse buffer com uma entrada na linha de comando do Vim. Uma versão funcional do seu exemplo seria

:tabnew | r !echo <c-r>=bufname("#")<cr>

Observe que, neste caso, o símbolo de pipe é um separador entre os comandos do Vim ex, não o pipe do shell. Veja também

:help :tabnew
:help :r!
:help :bar
garyjohn
fonte
É quase exatamente isso que eu preciso, ao contrário, para que eu possa acessar o nome do arquivo do buffer atual. Nota: atualizou a pergunta para esclarecer o resultado final desejado.
Richie Marquez
@ Richard Marquez: eu atualizei esta resposta. a nova guia está agora aberto com o "velho" nome do arquivo, assim que você poderia chamar: echo%!
akira
Mas não :r!echosem alterar o buffer.
precisa
2
@garyjohn, akira: obrigado pela ajuda. A parte "<cr> = ..." fez o Vim vomitar erros, mas eu consegui fazê-lo funcionar com ": tabnew | r! Echo #".
Richie Marquez
11
Também pode ser útil observar que, se você deseja mapear isso para uma chave no seu .vimrc, precisará substituir o | caractere com <bar>.
Richie Marquez
16

Aqui está o que eu faço. É mencionado nos comentários nas respostas acima.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Exemplo 1 : Encontre todos os arquivos de texto em/tmp

:new | r ! find /tmp -name '*.txt'

Exemplo 2 : você está editando o arquivo foo.txt e deseja executar ls -la foo.txte obter a saída em um buffer:

:new | r ! ls -la #

O #é substituído pelo nome do arquivo do buffer original que você está editando. Isso é particularmente útil para comandos de controle de origem ad-hoc, por exemplo

:new | r ! hg annotate -un #

:newcria uma divisão horizontal, use :vnewse desejar uma divisão vertical e :tabnewpara uma nova guia.

pensar demais
fonte
Você também pode responder a essa pergunta aqui ? trata-se de tentar usar o buffer atual %para o próximo buffer, mas o E499.
hhh
4
:tabnew | enew | r ! <your shell cmd>

funciona para mim.

justrajdeep
fonte
2

Se você realmente precisar armazenar o resultado em um novo buffer, mas precisar de informações do antigo buffer atual, poderá usar system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

ou armazene o nome do buffer atual para mais tarde :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Luc Hermitte
fonte
veja a outra resposta, você pode fazê-lo sem armazenar o nome em uma variável. mas boa resposta de qualquer maneira.
akira
De fato. Eu não tinha certeza de que '#' fornecerá o resultado esperado nesse caso - como nunca uso guias
Luc Hermitte 29/06/10