Despejar a saída do comando vim interno no buffer

18

Como despejo um comando vim interno (não o comando shell) em um novo buffer?

Por exemplo, eu quero despejar uma lista de todos os plugins em :enewde :scriptnamesmodo que eu possa busca-lo.

Bryce Guinta
fonte

Respostas:

24

Você pode usar :redirpara redirecionar a saída para uma variável, registro ou arquivo. Exemplo de redirecionamento para o registro sem nome:

:redir @">|silent scriptnames|redir END|enew|put

Como alternativa, o scriptease.vim de Tim Pope fornece o :Scriptnamescomando que será carregado :scriptnamesna lista de correções rápidas e :copen.

Se você se encontra redirecionando muitos comandos, você pode agrupar isso em um comando:

command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg

Agora você pode usar o :Redircomando para redirecionar a saída para um novo buffer. por exemplo :Redir scriptnamesou :Redir ls.

Vim 8+

O Vim 8 é enviado com a nova execute()função. Você pode usar a execute()função para, em vez de :redircapturar a saída ex-comando.

 :enew|pu=execute('scriptnames') 

Para obter mais ajuda, consulte:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Peter Rincker
fonte
O que ENDsignifica isso ?
Bryce Guinta
1
Ele para de redirecionar a saída para o registro, para que você possa ter uma saída regular novamente.
Tumbler41
1
:redir ENDdiz ao Vim para terminar o redirecionamento de mensagens. Veja:h :redir
Peter Rincker,
Para executar um comando externo e capturar sua saída em uma variável Vim, use system (). : let hostname = system ('hostname')
user3751385 29/07
2

Para ser completo, quero apresentar essas funções impressionantes que coletei (roubei) do romainl

" redirect the output of a Vim or external command into a scratch buffer
function! Redir(cmd)
  if a:cmd =~ '^!'
    execute "let output = system('" . substitute(a:cmd, '^!', '', '') . "')"
  else
    redir => output
    execute a:cmd
    redir END
  endif
  tabnew
  setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
  call setline(1, split(output, "\n"))
  put! = a:cmd
  put = '----'
endfunction
command! -nargs=1 Redir silent call Redir(<f-args>)

Isso levará a saída de comando normal ou do sistema e a colocará em uma nova guia. Sinta-se livre para alterar a linha tabnewpara vsplitou splitetc.

klaus
fonte
o link para @ gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7 de romainl
Dyno Fu
@DynoFu, link adicionado à minha resposta.
Klaus
1

Há também o plug-in bufferize.vim :

:Bufferize scriptnames

que é basicamente uma versão empacotada da resposta aceita (usando :redir) e pode ser mais conveniente para alguns.

Marius Gedminas
fonte