Dump dell'output del comando vim interno nel buffer


18

Come posso scaricare un comando vim interno (non comando shell) in un nuovo buffer?

Ad esempio, desidero scaricare un elenco di tutti i plug-in :enewda in :scriptnamesmodo da poterlo cercare.

Risposte:


24

È possibile utilizzare :redirper reindirizzare l'output su una variabile, un registro o un file. Esempio di reindirizzamento al registro senza nome:

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

In alternativa, lo scriptease.vim di Tim Pope fornisce il :Scriptnamescomando che verrà caricato :scriptnamesnell'elenco rapido e :copen.

Se ti ritrovi a reindirizzare molti comandi, potresti voler concludere in un comando:

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

Ora puoi usare il :Redircomando per reindirizzare l'output su un nuovo buffer. es . :Redir scriptnameso :Redir ls.

Vim 8+

Vim 8 viene fornito con la nuova execute()funzione. È possibile utilizzare la execute()funzione invece di :redircatturare l'output dell'ex comando.

 :enew|pu=execute('scriptnames') 

Per ulteriori informazioni, consultare:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()

Cosa ENDsignifica?
Bryce Guinta,

1
Smette di reindirizzare l'output al registro in modo da poter avere di nuovo un output regolare.
Tumbler41,

1
:redir ENDdice a Vim di terminare il reindirizzamento dei messaggi. Vedi:h :redir
Peter Rincker,

Per eseguire un comando esterno e acquisirne l'output in una variabile Vim, utilizzare system (). : let hostname = system ('hostname')
user3751385

2

Per completezza, voglio presentare queste fantastiche funzioni che ho raccolto (rubato) da 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>)

Questo richiederà l'output del comando normale o di sistema e lo inserirà in una nuova scheda. Sentiti libero di cambiare la linea tabnewin vsplito splitecc.



@DynoFu, ho aggiunto il link alla mia risposta.
klaus

1

C'è anche il plugin bufferize.vim :

:Bufferize scriptnames

che è fondamentalmente una versione impacchettata della risposta accettata (utilizzo :redir) e potrebbe essere più conveniente per alcuni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.