在Python中捕获vim命令的输出

1 投票
3 回答
900 浏览
提问于 2025-04-17 13:32

我想用 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:signvim.eval(),然后从Python调用这个函数。在这个包装函数中,你可以用:redir => var把输出重定向到一个本地变量,这样就不会覆盖到其他寄存器的内容了。

0

现在,从Python脚本中获取Vim命令的输出,没有比把输出重定向到一个变量或缓冲区,然后再查看里面的内容更好的方法了。

撰写回答