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 :enew
da in :scriptnames
modo da poterlo cercare.
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 :enew
da in :scriptnames
modo da poterlo cercare.
Risposte:
È possibile utilizzare :redir
per 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 :Scriptnames
comando che verrà caricato :scriptnames
nell'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 :Redir
comando per reindirizzare l'output su un nuovo buffer. es . :Redir scriptnames
o :Redir ls
.
Vim 8 viene fornito con la nuova execute()
funzione. È possibile utilizzare la execute()
funzione invece di :redir
catturare 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()
:redir END
dice a Vim di terminare il reindirizzamento dei messaggi. Vedi:h :redir
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 tabnew
in vsplit
o split
ecc.
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.
END
significa?