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.
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.
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 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()
:let hostname = system('hostname')
– user3751385 Jul 29 '17 at 08:37For 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)
To understand easily, I splitted full command into small sub commands:
Redirect to register "
Execute the actual command. Go till the end of output.
Stop redirect.
Open new buffer and paste from register "
:redir @"
:map
:redir END
:enew|put
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.
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.