12.6 稳健定义变量的技巧

当你定义的值为函数或函数列表的变量时,应分别使用以 ‘-function’ 或 ‘-functions’ 结尾的名称。

还有一些其他的变量命名规范,完整列表如下:

…-hook

该变量是普通钩子(hook)(see Hooks)。

…-function

变量的值是一个函数。

…-functions

变量的值是一个函数列表。

…-form

变量的值是一个形式(表达式)。

…-forms

变量的值是一个形式列表(表达式列表)。

…-predicate

值是一个谓词 — 即单参数函数,执行成功返回非 nil,失败返回 nil

…-flag

值的意义仅在于是否为 nil。 由于这类变量后续往往会被扩展使用更多取值,因此不强烈推荐该命名规范。

…-program

值是一个程序名。

…-command

值是一条完整的 Shell 命令。

…-switches

值用于指定命令的选项参数。

prefix--…

该变量为内部使用,定义在文件 prefix.el 中。 (2018 年之前贡献的 Emacs 代码可能遵循其他已逐步淘汰的规范。)

…-internal

该变量供内部使用,且是在 C 代码中定义的。 (2018 年之前贡献的 Emacs 代码可能遵循其他规范,这些规范正在逐步淘汰。)

定义变量时,务必考虑是否应将其标记为安全(safe)或风险(risky),详见 文件局部变量

当定义并初始化一个持有复杂值的变量时(例如主模式对应的语法表),最好将值的整个计算逻辑都写进 defvar 中,示例如下:

(defvar my-major-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?# "<" table)
    ...
    table)
  docstring)

这种方法有多个优点。首先,如果用户在加载文件的过程中退出,该变量要么仍未初始化,要么已正确完成初始化,绝不会处于中间状态。若变量仍未初始化,重新加载文件即可完成正确的初始化。其次,变量初始化完成后重新加载文件,其值不会被改变 —— 这一点在用户已修改过变量值的情况下尤为重要。第三,使用 C-M-xdefvar 形式求值时,会对该变量进行完全的重新初始化。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike