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


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

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


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


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>

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.