Vider la sortie de la commande vim interne dans le tampon

18

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.

Bryce Guinta
la source

Réponses:

24

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+

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()
Peter Rincker
la source
Que veut ENDdire?
Bryce Guinta du
1
Il arrête de rediriger la sortie vers le registre afin que vous puissiez à nouveau avoir une sortie régulière.
Tumbler41
1
:redir ENDindique à Vim de mettre fin à la redirection des messages. Voir:h :redir
Peter Rincker
Pour exécuter une commande externe et capturer sa sortie dans une variable Vim, utilisez system (). : let hostname = system ('hostname')
user3751385
2

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.

Klaus
la source
le lien vers @ romainl's gist gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu
@DynoFu, ajout d'un lien vers ma réponse.
klaus
1

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.

Marius Gedminas
la source