如何让Python控制台访问vim模块

时间:2013-07-13 01:21:44

标签: python vim

最近我一直在研究vim插件开发,我发现我错过了使用Python REPL(例如ipython / bpython)来检查vim模块的能力,以及通常的环境(当前打开的文档,行号,选择等)。

原则上 - 这不是非常先进的,而且我已经从其他嵌入Python的应用程序中完成了......

通常你可以这样做:

import code
code.interact(local=locals())

或者使用IPython:

import IPython
IPython.embed()

但是当vim嵌入Python时,它会取代sys.stdin/stdout/stderr, 我设法临时恢复这些并且它几乎可以工作但是仍然存在一些乱码行结尾的问题,并且stdin没有正确读取。

例如

std_back = sys.stderr, sys.stdin, sys.stdout
sys.stderr = sys.__stderr__
sys.stdout = sys.__stdout__
sys.stdin = sys.__stdin__

import IPython
IPython.embed()

sys.stderr, sys.stdin, sys.stdout = std_back

我在linux上尝试使用vim和gvim,并且stdin / stdout无法正常工作。 (很难解释,但只接受了每一个键输入,并且没有打印换行符,文本换行)。

所以我的最后一次尝试是使用idle,它绕过终端并用命令行打开一个tk界面。

import idlelib
import idlelib.PyShell
idlelib.PyShell.main()

这会加载控制台,但是在子进程中因此无法访问vim模块,我检查了idlelib源代码,发现你可以通过伪造一个命令行参数来禁用子进程,这个参数通常是空闲的直接从命令行启动访问。

import sys
sys.argv.append("-n")

import idlelib
import idlelib.PyShell
idlelib.PyShell.main()

好的,所以这可行,,Python开发人员将删除idlelib的选项以在进程内运行(目前已弃用)。 是否有其他开发人员知道在pyfile / py3file调用的vim中使用Python REPL的方法?

1 个答案:

答案 0 :(得分:2)

这是一个侦听网络套接字的简单解释器shell:

import socket
import sys
import code
from threading import Thread


def remote_shell(local, host='localhost', port=5555):
    serv = socket.socket()
    serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    serv.bind((host, port))
    serv.listen(1)
    streams = sys.stdout, sys.stderr
    print('listening on %s:%d' % (host, port))
    try:
        sock, addr = serv.accept()
        f = sock.makefile('rw')
        sys.stdout = sys.stderr = f

        def read(prompt):
                f.write(prompt)
                f.flush()
                return f.readline().rstrip('\n')

        code.interact(readfunc=read, local=local)
    finally:
        sys.stdout, sys.stderr = streams
        serv.close()
        sock.close()


if __name__ == '__main__':
    remote_shell(local=locals())
    # or if it should run in background:
    # Thread(target=remote_shell, kwargs={'local': locals()}).start()

要进行连接,只需使用:nc localhost 5555 - 但对于高级用途来说可能太受限制了。使用像rlwrap这样的工具至少可以拥有历史记录,但是更高级的readline功能(如制表符完成)将无效。但至少它是......