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.

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()

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.



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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.