#elisp #parser #incremental #list

tree-sitter-elisp

tree-sitter 解析库的 elisp 语法

4 个稳定版本

1.5.0 2024年6月18日
1.4.0 2024年6月18日
1.3.0 2023年6月3日
1.2.0 2021年9月27日

#72 in 文本编辑器


用于 3 个crate(2个直接使用)

MIT 许可证

235KB
7K SLoC

C 6.5K SLoC JavaScript 190 SLoC Scheme 62 SLoC // 0.1% comments Rust 33 SLoC // 0.4% comments

Emacs Lisp 的 Tree-sitter 语法

crates.io npm

elisp 的树-sitter 语法。

支持的语法

  • 原子(整数、浮点数、字符串、字符、符号)
  • 列表(正常语法 (a b) 和点列表 (a . b)
  • 向量
  • 引用和取消引用('#'`,,@
  • 一些特殊的读取语法($####(""foo"" 1 2 x)
  • 字节码文字(#[1 2 3 4]
  • 特殊形式(let 等)
  • 注释

限制

  • 自动加载cookie被视为普通注释

限制

Elisp 是一个具有用户定义宏的 lisp-2。简单的解析器无法检测例如 (foo (let ...)) 是否是具有 let 表达式参数的函数调用,或者是一个宏调用,其中 let 有其他含义。

目前 tree-sitter-elisp 将所有内容都视为 s 表达式。这是准确的,但使得此包在生成文件内容摘要或进行语法高亮时不太有用。

Emacs 本身有更多可用的信息。Emacs 会根据当前实例中定义的宏来高亮宏调用。一些 elisp 包也提供了自定义高亮逻辑,例如 dash.el 中的 dash-fontify-mode

开发

查看仓库,然后使用 npm 安装依赖项。

$ npm install

然后您可以解析您喜欢的 elisp 文件。

$ npm run parse ~/.emacs.d/init.el

语法本身在 grammar.js 中。编辑语法后,您需要重新生成代码。

$ npm run generate

此项目还包含一些测试。

$ npm test

您还可以运行此解析器对您的 .emacs.d 进行测试,以确认它能够解析所有内容。

$ npm run parse -- '/home/wilfred/.emacs.d/**/*.el' --quiet --stat

为什么?

阅读和编写 elisp 的最佳场所当然是 Emacs。

然而,在 tree-sitter 上构建的工具生态系统正在不断增长,例如 GitHub。这个项目应该能让它们也支持 emacs lisp。

tree-sitter-clojure 是另一个用于 Lisp 家族的 tree-sitter 包。它是一个有用的项目,可以与之进行比较,并且 有讨论 Lisp 特定挑战的笔记

language-emacs-lisp 是用于 Atom 和 GitHub 的 elisp 的 textmate 语法。

依赖关系

~2.8–4MB
~72K SLoC