装了treesit-auto这个插件,下载了全部文件,但是没看到有elisp的文件,是不支持elisp的代码高亮吗
emacs 本身的支持就足够了,它的语法太简单,没必要用 tree-sitter
guthub 上面的实现,整个 grammar.js 就没几行
eglot支持elisp代码报错码
elisp 不需要用 eglot. 直接用内置的 flymake 就可以了。
另外建议设置下:
(setq elisp-flymake-byte-compile-load-path (cons "./" load-path))
这是我个人用的 flymake 配置:
楼上说的已经到位了,做下补充
“eglot支持 elisp 代码报错”更准确的描述是:是否有 elisp LSP server 来通过 eglot 提供错误提示。目前似乎没有
我感觉Lisp系好像都不太需要treesitter
不知道为什么很多人产生了用了 treesit 高亮质量就会神奇地提高的误解。
实际上只是大部分 emacs 內建 mode 的高亮实现质量并不差,做的差的比如 tex-mode tree sitter 也一样做不好。emacs-lisp-mode 就是 font-lock 实现的细节比 treesit parser 多的。
我認同大部分情況下 Emacs 內建的高亮就足夠了. 不過像是某些語言 (C#, Python, 等等), 近年來語法越來越複雜, 使用 TreeSitter 的優勢就會開始顯現出來. 我認為的優劣勢大概是:
優勢
- 速度更快; 特別在 Windows 有更明顯的區別
- 更準確; 不過大部分的情況下是可以接受的
- 寫擴充更簡單了. 例如 ts-fold, codemetrics, ts-docstr, 等等.
劣勢
目前還真想不到, 除了一些 Emacs 內置 TreeSitter 的封裝理念以外. 我其實對它沒什麼太大的意見.
對我來說, 第三點算是個福音. 因為某些插件的邏輯特別複雜, 而 TreeSitter 寫起來比 RegEx 相對簡單些. 可以更清楚的專注在實現功能上面.
我从自已写过一次 tree sitter 以后,体会到以下缺点
- 开发 parser 需要 Node.js
- 一旦有功能不能用 parser generator 直接实现,就要用 C 写,非常蛋疼。
- 不能动态扩展关键字,font-lock 可以,emacs-lisp-mode 就用这个特性给 macro 加高亮
- 准不准完全取決于 parser 质量,越昰冷门语言质量越有问题。我用 Emacs 就是为了写冷门语言。
优点是实现代码缩进,分析代码结构比较方便,跨行代码高亮支持好。
因为语法实在是太简单了啊,tree-sitter-elisp 的实现只有不到 200 行。如果压缩一下不必要的换行可能更少。而 tree-sitter-c 的实现快接近 1500 行了。
行数是一方面,另一个问题是语言中有没有 LR(1) 冲突,有的话还得用 conflicts 和 prec.dynamic 规则消除。碰到一些难以表示的结构(比如 rust 允许嵌套块注释)还得用外部 scanner,很麻烦的。