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 :enew
de :scriptnames
modo que eu possa busca-lo.
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 :enew
de :scriptnames
modo que eu possa busca-lo.
Respostas:
Você pode usar :redir
para 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 :Scriptnames
comando que será carregado :scriptnames
na 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 :Redir
comando para redirecionar a saída para um novo buffer. por exemplo :Redir scriptnames
ou :Redir ls
.
O Vim 8 é enviado com a nova execute()
função. Você pode usar a execute()
função para, em vez de :redir
capturar 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()
:redir END
diz ao Vim para terminar o redirecionamento de mensagens. Veja:h :redir
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 tabnew
para vsplit
ou split
etc.
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.
END
significa isso ?