将emacs缓冲区发送到任意Python进程
我很喜欢 python-send-buffer
这个命令,但我经常在应用程序中使用嵌入的 Python,或者通过自定义的包管理系统来启动 Python(这样可以加载特定的依赖)。换句话说,我不能简单地运行“python”来获得一个有用的 Python 实例(而 python-send-buffer
就是依赖这个的)。
我想实现的目标是:
- 在任何 Python 解释器(或者允许你执行 Python 代码的应用程序)中,导入一个
magic_emacs_python_server.py
模块(必要时添加到sys.path
中) - 在 Emacs 中,运行
magic-emacs-python-send-buffer
这样就可以在远程的 Python 实例中执行缓冲区的代码。
这看起来应该很简单——这个 Python 模块在一个线程中监听一个套接字。它在主线程中执行代码,并返回结果的 repr()
(或者可能捕获标准输出/错误输出,或者两者都捕获)。Emacs 模块只需将文本发送到套接字,等待字符串响应,然后在缓冲区中显示出来。
听起来这么简单,应该已经有类似的东西了……IPython 有 ipy_vimserver
,但这方向是反的。还有 swank
,虽然它看起来非常特定于 Lisp,但有一个 JavaScript 后端,看起来很像我想要的……但是搜索几乎找不到相关的信息,除了有一些模糊的(可能是真的)说法,称 SLIME 和非 Lisp 语言不太兼容。
简而言之:
- 有没有项目可以将代码从 Emacs 缓冲区发送到现有的 Python 进程?
- 如果没有,你会推荐我怎么写这样的东西(因为我对 elisp 不太熟悉)——SWANK?IPython 的服务器代码?还是从头开始写一个简单的 TCP 服务器?
2 个回答
难道 shell-command
不能满足你的需求吗?你可以写一个包装脚本,或者适当地调整 #!
和 sys.path
。
comint 提供了很多基础设施,适合用来做这类事情。这里有一些不错的例子,比如 这个 和 这个
它允许你运行命令,并提供了像 comint-send-string
这样的功能,可以方便地实现 send-region
类型的命令。
dbr/remoterepl 在 Github 上 是一个简单的概念验证,展示了我在问题中描述的内容。
虽然它没有经过任何打磨,但基本上是可以工作的——你只需在目标解释器中导入 replify.py
模块,然后在修正了 client.py
的硬编码路径后,评估 emacs-remote-repl.el
。