以下是编写面向广泛使用的 Emacs Lisp 代码时应当遵守的规范:
对于包含自定义定义的任何文件,该规范都是强制性要求。 若修复此类文件以遵守该规范需要引入不兼容变更,应直接执行该不兼容变更,不要推迟。
偶尔,对于面向用户使用的命令名称,若部分单词放在包名前缀之前会更易用,也可如此处理。 例如,我们约定列出对象的命令命名为 ‘list-something’, 比如名为 ‘frob’ 的包可以有命令 ‘list-frobs’,而其其他全局符号仍以 ‘frob-’ 开头。 此外,定义函数、变量等的构造体以 ‘define-’ 开头通常效果更好,因此可以将名称前缀放在稍后位置。 但除了这些既定场景外,应优先在名称前添加前缀。
若你编写了一个函数,认为其应当以某个名称加入 Emacs(如 twiddle-files),
不要在你的程序中直接使用该名称。应在程序中将其命名为 mylib-twiddle-files,
并发送邮件至 ‘[email protected]’ 建议我们将其加入 Emacs。
当我们采纳时,再修改名称即可。
若一个前缀不够用,你的包可以使用两到三个通用前缀,只要命名合理即可。
lexical-binding,
并将未启用该特性的现有 Emacs Lisp 代码改造为启用状态。See 选择 Lisp 方言。
provide 调用。See 功能。
require 确保其被加载。See 功能。
(eval-when-compile (require 'bar))
该语句告知 Emacs 在字节编译 foo 之前加载 bar,
从而保证编译期间宏定义可用。
使用 eval-when-compile 可以避免在使用 foo 的编译版本时加载 bar。
该语句应放在文件中首次使用该宏之前。See 宏与字节编译。
require 该库即可。
但若文件包含多个独立功能,仅其中一两个需要额外库,
则考虑将 require 语句放在相关函数内部而非顶层,
或使用 autoload 语句在需要时加载额外库。
这样,不使用这些功能的用户就无需加载该额外库。
cl-lib 库,
而非旧的 cl 库。后者已被废弃,并将在未来版本的 Emacs 中移除。
framep 和 frame-live-p。
我们建议布尔变量名避免使用 -p 后缀,除非该变量绑定到谓词函数;
可改用 -flag 后缀或 is-foo 这类名称。
unload-feature 会撤销加载特性时通常执行的修改(如向钩子添加函数)。
但是,若加载 feature 时执行了特殊且复杂的操作,
可以定义名为 feature-unload-function 的函数,用于撤销这些特殊修改。
unload-feature 会在该函数存在时自动运行。See 卸载。
(defalias 'gnus-point-at-bol
(if (fboundp 'point-at-bol)
'point-at-bol
'line-beginning-position))
eval-after-load 和 with-eval-after-load。see 加载相关钩子。
该特性专为个人定制设计;在 Lisp 程序中使用会导致结构不清晰,
因为它会以文件中不可见的方式修改另一个 Lisp 文件的行为。
这会给调试带来障碍,与 advising 其他包中的函数类似。
path,优先使用 file、file-name 或 directory。
因为 Emacs 遵循 GNU 规范,仅将术语 路径(path) 用于搜索路径(即目录名列表)。