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 :enew
de :scriptnames
sorte 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 :enew
de :scriptnames
sorte que je puisse le fouiller.
Réponses:
Vous pouvez utiliser :redir
pour 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 :Scriptnames
commande qui se chargera :scriptnames
dans 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 :Redir
commande pour rediriger la sortie vers un nouveau tampon. par exemple :Redir scriptnames
ou :Redir ls
.
Vim 8 est livré avec la nouvelle execute()
fonction. Vous pouvez utiliser la execute()
fonction à au lieu de :redir
pour 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 END
indique à 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 tabnew
en vsplit
ou split
etc.
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.
END
dire?