在Python中捕获vim命令的输出
我想用 Python 和 vim 模块来获取 Vim 命令(:sign place
)的输出。
我可以用 vim.command(...)
来执行命令,但这样并不会返回命令的输出。我也可以用 vim.eval(...)
来评估 vimL 命令,但这只适用于变量和 函数,而不适用于命令。
我能捕获这个命令输出的唯一方法是先把输出重定向到一个寄存器,然后再评估这个寄存器的内容:
vim.command('redir @a')
vim.command('silent sign place')
vim.command('redir END')
command_output = vim.eval('@a')
不过,这看起来对于一个看似简单的任务来说,工作量有点大。有没有更好的方法呢?
注意:这并不是针对示例命令 sign place
的特定问题 - 对于任何命令都是有效的。
3 个回答
0
这个链接 https://vi.stackexchange.com/a/13881/10254 可能会对你有帮助,基本上讲的是获取输入,然后运行命令,捕获结果并放入。虽然是用vimscript函数,而不是python,涉及到的函数有 Capture(excmd)
、PutAfterCapture(command)
和 GetInputCommandThenCaptureAndPut()
。
摘录:
func! abort " from tpope's scriptease.vim
try
redir => out
exe 'silent! '.a:excmd
finally
redir END
endtry
return out
endfunc
0
很遗憾,目前在Vimscript中对标记的支持还不太好(就像我在其他回答中提到的)。我会做的是写一个Vimscript的包装函数,围绕着:redir
、:sign
和vim.eval()
,然后从Python调用这个函数。在这个包装函数中,你可以用:redir => var
把输出重定向到一个本地变量,这样就不会覆盖到其他寄存器的内容了。
0
现在,从Python脚本中获取Vim命令的输出,没有比把输出重定向到一个变量或缓冲区,然后再查看里面的内容更好的方法了。