如何快速使用 ELisp 进行插件编写

2022-07-26 16:26:24 浏览数 (1)

最近在给 cider 贡献一个新 feature[1],但是由于之前只是东拼西凑配置,没怎么用 ELisp 认真写过一个完整功能,还是有些挫败感的。

挫败感的主要来源是对 ELisp 里相关概念的不熟悉,比如 xref 为了能打开 symbol 定义的文件,需要提供一个 xref-location 对象,默认提供了两种实现,xref-buffer-location 与 xref-file-location。

file 这个比较直观,传入 file/line/column 即可,但是我 buffer 这个则需要传入一个 position,但没说 position 怎么构造,我就猜 position 是个 (line . column) 的 cons?后来测试了下不行,然后去看 buffer location 的定义,position 的类型是 fixnum,既然是个数字,应该表示的是 offset,那么又一个问题,是 0 开始还是 1 开始呢?

故事写到这里就差不多了,最终我 在李杀的网站上找到了答案,直接调用 (point) 即可获得当前位置的 position。

从这里例子看出,ELisp 的文档虽然做的很全,但是缺少很重要的一个环节,即 demo。要知道 Lisp 的一重要提高生产效率的工具是 REPL,没有 demo 让我复制,我怎么在 REPL 里测试?

而且程序员都很懒、很忙,去仔细看 manual 不现实,而且 Emacs 的 manual 我感觉有些“重”了,文字太多了,看的累,我需要的仅仅是个很 copy 的示例,然后再根据我的需求改改就好了,就行 clojuredocs 那样,比如 reduce[2] 页面:

幸好在 Emacs China TG 组交流“心得”后,发现了 elisp-demos[3] 插件,可以在 helpful 页面中展示函数的用法:

最后,再推荐一个教程,供有其他 Lisp 经验的程序员快速使用 ELisp。

• https://github.com/chrisdone/elisp-guide

引用链接

[1] feature: https://github.com/clojure-emacs/cider/pull/3026 [2] reduce: https://clojuredocs.org/clojure.core/reduce [3] elisp-demos: https://github.com/xuchunyang/elisp-demos

0 人点赞