Python和Elisp协同编程框架

EAF、 lsp-bridge 和 blink-search 都受益于Python-EPC和Python多线程的跨进程事件循环框架, 极大的提升了 Emacs 的响应速度。

我昨天把 EAF 自身代码删除了, 单独把框架性代码独立出来 GitHub - manateelazycat/python-bridge: Write Emacs Plugin by Python, split code from EAF.

有需要的同学可以自己 fork 后, 快速给 Emacs 开发 Python 插件。

15 个赞

谢谢大佬,用 Emacs 也非常受益这个实现。现在的补全方案,buffer 中用 lsp-bridge,minibuffer 用的是 virtico + orderless + embark. 期待 python-bridge 拓宽更多 Emacs 的应用场景: GPE is a Pure Emacs:

3 个赞

有空可以尝试一下 blink-search, 速度最快的 minibuffer 的搜索框架(我说的是比 ivy 都还快), helm多后端混合设计。

那lsp-bridge依赖这个包吗?

不依赖,这个是独立的包,方便大家独立构建类似lsp-bridge或eaf这种插件。

这个GPE项目好赞,抄了抄了~ :crazy_face:

谢谢~ 这都是托大佬们的福,希望这个通用简洁能够易于拓展大佬的协同框架。

昨晚用 git submodule 安转了下:

git submodule add [email protected]:manateelazycat/blink-search.git blink-search

配置为:

  (use-package blink-search
  :ensure nil
  :load-path "~/.emacs.d/site-lisp/blink-search"
  :commands blink-search
  :bind ("s-8" . blink-search))

这个 search 非常迅速且流畅。 :+1:

1 个赞

python-bridge 可以给 Emacs 设置、修改 变量吗? 看了一圈没有函数。

尝试:

        eval_in_emacs("seq", "subed-mpv-media-file", “test”)

不能成功调用 setq,因为 setq 是 C?不是 Lisp 写的?

你直接写一个elisp函数,在elisp函数里改变量设置呀。

:grinning:

好的,现在就是这么做的,只是想着为了设置变量再创建一个函数,有的强迫症的我比较不爽而已。

试一下这个 emacs-application-framework/utils.py at 442a2b39f50999d6b2a9297d709758db52e920c6 · emacs-eaf/emacs-application-framework · GitHub

1 个赞

赞!Python/JS 生态很强大,一个在 ML/AI 领域,一个在 Web 领域,看 EAF 框架把两种能力都接入了 Emacs,让 Emacs 能很容易享受到这两个社区的红利,比如 openai 的 API,官方就只提供了这两种语言的 library。看大佬把两种语言都支持了,有这种协同编程框架,就不用从头对着其它语言实现撸纯 elisp 的实现了。不过就是依赖包装起来比较麻烦 :rofl:

python-bridge 就是一条 pip 命令就安装了所有依赖。

EAF 有 install-eaf.py 脚本, 默认只安装浏览器和PDF阅读器, 安装应用少就依赖少。

很长时间没写 python 了,在 debian 上按以前经验 pip3 install openai --user 安装依赖,发现 debian 直接强制让用 venv

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installatio
n or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

有点跟不上现在安装依赖的最佳实践是什么样的了,这么整个 venv,岂不是每次启动 emacs 还要激活一下 venv 才能用。不过好在是虚拟机,就无所谓了,直接按提示加 --break-system-packages 强制装了 ¯_(ツ)_/¯

还有 GitHub - manateelazycat/deno-bridge: Build bridge between Emacs and Deno, execution of JavaScript and Typescript within Emacs. , 可以让 elisp 直接访问 deno, rust 和 wasm.

嗯,正在翻 deno 那个老帖子 :grinning:

大佬们,能简单描述下怎么使用这个包嘛? 我这边想简单的打印个helloworld,但是下述代码不对,能指正下嘛 :sweat_smile:

(require 'python-bridge)
(python-bridge-call-async  "print" "hello world")

python-bridge 继承了 epc 的实现,所以可以从 epc-python 或者 epc-emacs 中找到一些例子。

不过毕竟调教过,所以可以直接看 lazycat 使用了类似功能的包,比如 eaf, lsp, mind-wave, 其中 mind-wave 比较简单,简单参考就可以写出一个 “hello world” 了:

在 python_bridge.py 的 MindWave 类中添加如下方法:

 def echo(self, a):
        eval_in_emacs("message", a)

然后通过 (python-bridge-start-process)(python-bridge-restart-process) 重启 python-bridge 对应的 python 进程,然后在 Emacs 中调用:

(python-bridge-call-async "echo” "1")

没有问题的话,应该能在 echo area 看到 1.

毕竟是异步,要注意回调。

3 个赞

感谢指导 :+1:

2 个赞