8.5 使用 defvar 初始化变量

copy-region-as-kill 函数由 Emacs Lisp 编写。 其中的两个函数 kill-appendkill-new 会复制缓冲区中的选区并保存到名为 kill-ring 的变量中。 本节介绍如何使用 defvar 特殊形式 创建并初始化 kill-ring 变量。

(我们再次说明,kill-ring 这个名称其实并不准确。 从缓冲区中剪切的文本可以被取回, 它并非“尸体环”,而是可“复活”的文本环。)

在 Emacs Lisp 中, 像 kill-ring 这样的变量 通过 defvar 特殊形式创建并赋予初始值, 名称取自 “define variable”。

defvar 特殊形式与 setq 类似, 都用于设置变量的值。 它与 setq 有三点不同: 第一,它会将变量标记为 “特殊(special)”, 使其始终采用动态绑定, 即使 lexical-bindingt 也是如此 (see let 绑定变量的方式)。 第二,它仅在变量尚无值时才设置其值; 如果变量已有值,defvar 不会覆盖现有值。 第三,defvar 支持文档字符串。

(还有一个相关宏 defcustom, 专为用户需要自定义的变量设计, 功能比 defvar 更丰富。 (See Setting Variables with defcustom.)