该技能是面向 Emacs Lisp 开发的风格指导技能,依据社区驱动的 Emacs Lisp Style Guide,帮助编写专业、可维护的 Emacs Lisp 代码。
适用场景:编写 Emacs 配置文件(如 ~/.emacs.d/init.el);创建 Emacs 包或库;开发主模式或次模式;编写交互命令与函数;创建键位绑定与钩子;重构现有 Emacs Lisp 代码;设置包元数据与自动加载;编写 Emacs Lisp 宏;创建自定义变量与 face。
主要能力与规范要点:
源码布局:使用空格而非制表符;函数参数垂直对齐;特殊形式按惯例缩进(特殊参数 4 空格、主体 2 空格);行宽尽量控制在 80 字符;括号前留空格、闭括号集中在同一行;顶层形式之间留空行。
语法与惯用法:单分支条件用 when,否定条件用 unless,一般 nil 判断用 not,专用空列表判断用 null;利用链式比较函数;cond 以 t 作兜底;使用 1+ 和 1-;优先 with-eval-after-load。
命名约定:使用 kebab-case;公共符号加库名前缀,私有函数用双连字符;未使用参数以下划线开头;单词谓词以 p 结尾,多词谓词以 -p 结尾;face 名称不加 -face 后缀。
函数:lambda 仅用于局部,钩子使用具名函数;不使用硬引用 lambda;不为已有函数写多余包装;函数名用 #' 引用;参数过多时改用 plist 或 cl-defun 关键字参数。
宏:仅当函数无法实现时才用宏;先写出期望的调用示例再实现;使用 declare 声明缩进与调试信息;优先使用反引号语法。
文档:为公共函数和变量编写完整 docstring,首行是完整句子;注释解释原因而非重复代码;使用 TODO、FIXME 等标注关键字。
加载与自动加载:文件头包含 lexical-binding、Author、Version、Package-Requires、Keywords、URL 等;依赖用 require 而非 load;面向用户的交互命令加 ;;;###autoload 注释。
词法绑定:新代码始终在文件头启用 lexical-binding,闭包才能正确工作。
列表操作:迭代副作用用 dolist 或 seq-do,不用 mapcar 做副作用。
交互命令:正确使用 interactive 规范,如 "F"、"p" 及多参数列表形式。
错误处理:用带描述信息的 error 报告错误,用户操作失误用 user-error,需要捕获时用 condition-case。
使用方式:在编写或重构 Emacs Lisp 代码时调用该技能,按上述规范生成或检查代码。
限制:该资料为风格指南性质,未提供安装命令、运行环境要求、收费信息或效果保证;具体适用版本与工具链支持暂未提供。