Saída de tubulação do comando shell (!) em um novo buffer no Vim

29

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

:!echo % | :newtab
    
por Richie Marquez 29.06.2010 / 07:32

4 respostas

23

Você não pode canalizar a saída de um comando shell em um comando que cria um novo buffer, mas pode criar um novo buffer e ler a saída de um comando shell nesse 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>

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

:help :tabnew
:help :r!
:help :bar
    
por 29.06.2010 / 08:16
11

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.txt e 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 #

:new cria uma divisão horizontal, use :vnew se você quiser uma divisão vertical e :tabnew para uma nova guia.

    
por 12.06.2012 / 17:20
4
:tabnew | enew | r ! <your shell cmd>

funciona para mim.

    
por 10.03.2012 / 09:12
1

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

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

ou armazene o nome atual do buffer para mais tarde :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
    
por 29.06.2010 / 09:47

Tags