如何将内部vim命令(不是shell命令)转储到新缓冲区中?
例如,我想将所有插件的清单转储:enew
自,:scriptnames
以便可以搜索它。
如何将内部vim命令(不是shell命令)转储到新缓冲区中?
例如,我想将所有插件的清单转储:enew
自,:scriptnames
以便可以搜索它。
Answers:
您可以用于: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附带了新execute()
功能。您可以使用execute()
函数代替:redir
捕获前命令输出。
:enew|pu=execute('scriptnames')
有关更多帮助,请参见:
:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
:redir END
告诉Vim结束重定向消息。请参阅:h :redir
为了完整起见,我想介绍一下我从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>)
这将采用常规或系统命令输出,并将其放在新选项卡中。随意将行更改tabnew
为vsplit
或split
等。
END
意思