将内部vim命令的输出转储到缓冲区


Answers:


24

您可以用于:redir将输出重定向到变量,寄存器或文件。重定向到未命名寄存器的示例:

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

另外,Tim Pope的scriptease.vim提供了:Scriptnames将加载:scriptnames到quickfix列表和中的命令:copen

如果您发现自己重定向了许多命令,则可能需要将其包装在一个命令中:

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

现在,您可以使用:Redir命令将输出重定向到新缓冲区。例如:Redir scriptnames:Redir ls

Vim 8+

Vim 8附带了新execute()功能。您可以使用execute()函数代替:redir捕获前命令输出。

 :enew|pu=execute('scriptnames') 

有关更多帮助,请参见:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()

什么END意思
Bryce Guinta

1
它将停止将输出重定向到寄存器,因此您可以再次获得常规输出。
Tumbler41年

1
:redir END告诉Vim结束重定向消息。请参阅:h :redir
Peter Rincker

要执行外部命令并将其输出捕获到Vim变量中,请使用system()。:let hostname = system('hostname')
user3751385

2

为了完整起见,我想介绍一下我从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>)

这将采用常规或系统命令输出,并将其放在新选项卡中。随意将行更改tabnewvsplitsplit等。



@DynoFu,添加了指向我的答案的链接。
克劳斯,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.