56

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.

Bryce Guinta
  • 665
  • 1
  • 5
  • 8

5 Answers5

71

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()
Peter Rincker
  • 15,854
  • 1
  • 36
  • 45
8

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 vnew or new etc.

(new and vnew are alternatives to split and vsplit as the output would otherwise be printed in your current file)

3N4N
  • 5,684
  • 18
  • 45
6

To understand easily, I splitted full command into small sub commands:

  1. Redirect to register "

  2. Execute the actual command. Go till the end of output.

  3. Stop redirect.

  4. Open new buffer and paste from register "

    :redir @"
    :map
    :redir END
    :enew|put
    
me_astr
  • 173
  • 1
  • 5
5

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.

Marius Gedminas
  • 281
  • 3
  • 4
0

the best solution is with the asyncrun plugin (requiring vim8+): https://github.com/skywind3000/asyncrun.vim

:AsyncRun -mode=term -pos=bottom -rows=15 -cols=40 -focus=0 pwd

will open a 15 rows terminal at bottom, run the linux command pwd and display the output there.

read its wiki for more info.

Ping
  • 17
  • 1