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
:scriptnames so that I can search it.
Vi and Vim Stack Exchange is a question and answer site for people using the vi and Vim families of text editors. It only takes a minute to sign up.Sign up to join this community
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
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
Vim 8 ships with the new
execute() function. You can use the
execute() function to instead of
:redir to capture ex-command output.
For more help see:
:h :redir :h :silent :h :scriptnames :h :enew :h :put :h execute()
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
vnew are alternatives to
vsplit as the output would otherwise be printed in your current file)
There's also the bufferize.vim plugin:
which is basically a packaged version of the accepted answer (using
:redir) and may be more convenient for some.
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.