8.5.1 defvar 与星号

在早期,Emacs 既使用 defvar 特殊形式定义内部变量(用户一般不会修改), 也用它定义用户可配置变量。尽管现在仍然可以用 defvar 定义用户可配置变量, 但建议改用 defcustom,因为它能对接自定义设置命令。 (see Specifying Variables using defcustom.)

在使用 defvar 定义变量时,可以在文档字符串第一列开头写一个星号 ‘*’, 以此区分该变量是用户可能需要修改的配置项。例如:

(defvar shell-command-default-error-buffer nil
  "*`shell-command' 命令错误输出所用的缓冲区名称。
... ")

你可以(现在依然可以)使用 set-variable 命令临时修改 shell-command-default-error-buffer 的值。 不过,通过 set-variable 设置的选项只在当前编辑会话生效, 重启 Emacs 后不会保留。每次 Emacs 启动都会读取原始值, 除非你在 .emacs 文件中手动设置或通过 customize 进行修改。 See Your .emacs File.

对我而言,set-variable 命令的主要用途是提示我有哪些变量 可以写进 .emacs 配置。这类变量如今已有 700 多个, 很难全部记住。好在执行 M-x set-variable 后按 TAB, 就能看到变量列表。(See Examining and Setting Variables in The GNU Emacs Manual.)