Cloel
Cloel 是一个结合 Clojure 和 Elisp 的协同编程框架, 利用 Clojure 的生态和多线程能力来扩展 Emacs。
主要优势:
- 速度快: 耗时代码在外部 Clojure 进程执行, 避免卡住 Emacs
- 多线程: 利用 Clojure 的多线程, 保证快速响应
- Lisp 风格: 用 Clojure 写插件也能保持 Lisp 风格
- 强大生态: 可访问 JVM 和 Python 的软件包生态
- 低门槛: 开箱即用的框架, 简化 Emacs 的 Clojure 扩展开发
安装
-
安装 Clojure, 参考 官方手册
-
安装 parseedn
- 安装 Cloel Elisp 部分:
- 克隆仓库并添加到 Emacs 配置:
(add-to-list 'load-path "<path-to-cloel>") (require 'cloel)
- 克隆仓库并添加到 Emacs 配置:
- 安装 Cloel Clojure 部分:
cd cloel clojure -X:jar clojure -X:install
- 测试:
- 执行
M-x load-file
选择cloel/demo/app.el
- 执行
M-x cloel-demo-test
- 如果显示 “Cloel rocks!” 则安装成功, 没有成功请查看
*cloel-demo-clojure-server*
buffer 以反馈报错信息
- 执行
版本更新
每次更新 Cloel 后都需要执行 clojure -X:jar; clojure -X:install
来更新 Clojure 代码, 避免版本升级后的兼容性问题。
开发
开发时可通过 grep “STEP” 关键字来理解 Demo 程序结构。
以下是 API 详情, 将 app
替换为你的应用名:
Elisp API:
cloel-register-app
: 注册应用, 需要输入应用名和 Clojure 代码的路径, 应用名以app
为例cloel-app-start/stop/restart-process
: 管理 Clojure 进程cloel-app-send-message
: Elisp 异步发送消息给 Clojurecloel-app-call-async
: Elisp 异步调用 Clojure 函数cloel-app-call-sync
: Elisp 同步调用 Clojure 函数
Clojure API:
cloel/start-server
: 启动 Clojure 进程cloel/elisp-show-message
: Clojure 异步在 minibuffer 显示消息cloel/elisp-get-var
: Clojure 同步获取 Elisp 变量值cloel/elisp-eval-async
: Clojure 异步调用 Elisp 函数cloel/elisp-eval-sync
: Clojure 同步调用 Elisp 函数
Clojure 可以被重载的接口:
handle-client-async-call
: 处理 Elisp 异步调用 Clojure 函数的接口handle-client-sync-call
: 处理 Elisp 同步调用 Clojure 函数的接口handle-client-message
: 处理 Elisp 异步发送消息给 Clojure 的接口handle-client-connected
: Client 连接上 Clojure 进程时的接口
在 Clojure 中, 我们可以使用 alter-var-root
在应用端重载上面的接口实现, 具体请看 demo/app.clj