如何将内部vim命令(不是shell命令)转储到新缓冲区中?

例如,我想将所有插件列表从:enew转储到:scriptnames中,以便可以搜索。 br />

#1 楼

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

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


Tim Pope的scriptease.vim提供:Scriptnames命令,它将:scriptnames加载到快速修复列表和:copen中。
如果您发现自己重定向了许多命令,则可能需要将其包装在一个命令中:输出到新的缓冲区。例如:Redir:Redir scriptnames

Vim 8+

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

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


有关更多帮助,请参见:

 :enew|pu=execute('scriptnames') 


评论


END是什么意思?

–布莱斯·昆塔(Bryce Guinta)
16 Jun 22 '17:00



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

– Tumbler41
16年6月22日在17:01

:redir END告诉Vim结束重定向消息。见:h:redir

– Peter Rincker
16年6月22日在17:01



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

–user3751385
17年7月29日在8:37



#2 楼

为了完整起见,我想展示一下我从romainl收集(偷走)的这些很棒的功能。

。随时将tabnew更改为vsplitsplit等。

评论


指向@ romainl的要点gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7的链接

–Dyno Fu
18/12/10在4:12

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

–klaus
19 Mar 30 '19在4:45

#3 楼

这里还有bufferize.vim插件: >

#4 楼

最好的解决方案是使用asyncrun插件(需要vim8 +):
https://github.com/skywind3000/asyncrun.vim

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


将打开一个底部有15行终端,运行linux命令pwd并在其中显示输出。

阅读其Wiki了解更多信息。

评论


OP希望捕获Vim命令而不是Shell命令的输出。

–丰富
20-2-5在17:30

#5 楼

为了易于理解,我将完整的命令分为几个子命令:


重定向到注册“


执行实际命令。直到最后输出的结果。


停止重定向。


打开新缓冲区,然后从寄存器“
:redir @"
:map
:redir END
:enew|put


粘贴” >