最近在给 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