14

How do I dump an internal vim command (not shell command) into a new buffer?

For example, I want to dump a listing of all plugins into :enew from :scriptnames so that I can search it.

18

You can use :redir to redirect the output to a variable, register, or file. Example of redirecting to the unnamed register:

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

Alternatively Tim Pope's scriptease.vim provides the :Scriptnames command which will load :scriptnames into the quickfix list and :copen.

If you find yourself redirecting many commands you may want to wrap up this up in a command:

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

Now you can use the :Redir command to redirect the output to a new buffer. e.g. :Redir scriptnames or :Redir ls.

Vim 8+

Vim 8 ships with the new execute() function. You can use the execute() function to instead of :redir to capture ex-command output.

 :enew|pu=execute('scriptnames') 

For more help see:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
  • What does END mean? – Bryce Guinta Jun 22 '16 at 17:00
  • 1
    It stops redirecting the output to the register so you can have regular output again. – Tumbler41 Jun 22 '16 at 17:01
  • 1
    :redir END tells Vim to end redirecting messages. See :h :redir – Peter Rincker Jun 22 '16 at 17:01
  • To execute an external command and capture its output in a Vim variable, use system(). :let hostname = system('hostname') – user3751385 Jul 29 '17 at 8:37
2

For completeness, I want to present this awesome functions that I collected (stole) from 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>)

This will take normal or system command output and put it in a new tab. Feel free to change the line tabnew to vsplit or split etc.

1

There's also the bufferize.vim plugin:

:Bufferize scriptnames

which is basically a packaged version of the accepted answer (using :redir) and may be more convenient for some.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.