Volcar la salida del comando vim interno en el búfer

18

¿Cómo vuelco un comando vim interno (no un comando de shell) en un nuevo búfer?

Por ejemplo, quiero volcar una lista de todos los plugins en :enewde :scriptnamesmodo que pueda buscarla.

Bryce Guinta
fuente

Respuestas:

24

Puede usar :redirpara redirigir la salida a una variable, registro o archivo. Ejemplo de redireccionamiento al registro sin nombre:

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

Alternativamente, scriptease.vim de Tim Pope proporciona el :Scriptnamescomando que se cargará :scriptnamesen la lista de soluciones rápidas y :copen.

Si se encuentra redirigiendo muchos comandos, es posible que desee resumir esto en un comando:

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

Ahora puede usar el :Redircomando para redirigir la salida a un nuevo búfer. por ejemplo :Redir scriptnameso :Redir ls.

Vim 8+

Vim 8 se entrega con la nueva execute()función. Puede usar la execute()función en lugar de :redircapturar la salida del comando anterior.

 :enew|pu=execute('scriptnames') 

Para más ayuda ver:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Peter Rincker
fuente
Que ENDsignifica
Bryce Guinta
1
Deja de redirigir la salida al registro para que pueda tener una salida regular nuevamente.
Tumbler41
1
:redir ENDle dice a Vim que finalice la redirección de mensajes. Ver:h :redir
Peter Rincker
Para ejecutar un comando externo y capturar su salida en una variable Vim, use system (). : let hostname = system ('hostname')
user3751385
2

Para completar, quiero presentar estas increíbles funciones que recopilé (robé) de 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>)

Esto tomará la salida de comando normal o del sistema y lo colocará en una nueva pestaña. Siéntase libre de cambiar la línea tabnewa vsplit, o splitetc.

Klaus
fuente
@DynoFu, enlace agregado a mi respuesta.
Klaus
1

También está el plugin bufferize.vim :

:Bufferize scriptnames

que es básicamente una versión empaquetada de la respuesta aceptada (usando :redir) y puede ser más conveniente para algunos.

Marius Gedminas
fuente