Comment vider une commande vim interne (pas une commande shell) dans un nouveau tampon?
Par exemple, je veux vider une liste de tous les plug - ins dans :enewde :scriptnamessorte que je puisse le fouiller.
Comment vider une commande vim interne (pas une commande shell) dans un nouveau tampon?
Par exemple, je veux vider une liste de tous les plug - ins dans :enewde :scriptnamessorte que je puisse le fouiller.
Réponses:
Vous pouvez utiliser :redirpour rediriger la sortie vers une variable, un registre ou un fichier. Exemple de redirection vers le registre sans nom:
:redir @">|silent scriptnames|redir END|enew|put
Alternativement, scriptease.vim de Tim Pope fournit la :Scriptnamescommande qui se chargera :scriptnamesdans la liste des correctifs rapides et :copen.
Si vous vous retrouvez en train de rediriger de nombreuses commandes, vous voudrez peut-être résumer cela dans une commande:
command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg
Vous pouvez maintenant utiliser la :Redircommande pour rediriger la sortie vers un nouveau tampon. par exemple :Redir scriptnamesou :Redir ls.
Vim 8 est livré avec la nouvelle execute()fonction. Vous pouvez utiliser la execute()fonction à au lieu de :redirpour capturer la sortie de l'ex-commande.
:enew|pu=execute('scriptnames')
Pour plus d'aide, voir:
:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
:redir ENDindique à Vim de mettre fin à la redirection des messages. Voir:h :redir
Pour être complet, je veux présenter ces fonctions impressionnantes que j'ai collectées (volées) 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>)
Cela prendra la sortie de commande normale ou système et la placera dans un nouvel onglet. N'hésitez pas à changer la ligne tabnewen vsplitou splitetc.
Il y a aussi le plugin bufferize.vim :
:Bufferize scriptnames
qui est essentiellement une version packagée de la réponse acceptée (en utilisant :redir) et peut être plus pratique pour certains.
ENDdire?