将emacs缓冲区发送到任意Python进程

4 投票
2 回答
1315 浏览
提问于 2025-04-16 10:43

我很喜欢 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 个回答

1

难道 shell-command 不能满足你的需求吗?你可以写一个包装脚本,或者适当地调整 #!sys.path

2

comint 提供了很多基础设施,适合用来做这类事情。这里有一些不错的例子,比如 这个这个

它允许你运行命令,并提供了像 comint-send-string 这样的功能,可以方便地实现 send-region 类型的命令。

dbr/remoterepl 在 Github 上 是一个简单的概念验证,展示了我在问题中描述的内容。

虽然它没有经过任何打磨,但基本上是可以工作的——你只需在目标解释器中导入 replify.py 模块,然后在修正了 client.py 的硬编码路径后,评估 emacs-remote-repl.el

撰写回答