12.15 变量别名

有时将两个变量设为同义词会很实用——这意味着两个变量始终拥有相同的值, 修改其中任意一个也会同步修改另一个。当你需要修改某个变量的名称时(无论是因为发现旧名称命名不当, 还是因为变量的语义发生了部分变化),为了保证兼容性,可将旧名称保留为新名称的 别名。 你可以通过 defvaralias 函数实现这一功能。

Function: defvaralias new-alias base-variable &optional docstring

该函数将符号 new-alias 定义为符号 base-variable 的变量别名。 这意味着:获取 new-alias 的值时,会返回 base-variable 的值; 修改 new-alias 的值时,也会同步修改 base-variable 的值。 这两个互为别名的变量名始终共享相同的值和相同的绑定关系。

docstring(文档字符串)参数的值为非 nil,则该参数会为 new-alias(新别名)指定文档说明; 若该参数为 nil,则这个别名会继承 base-variable(基准变量)的文档说明(如果基准变量有文档说明的话); 但如果 base-variable 本身也是一个别名,那么 new-alias 会继承别名链末端那个变量的文档说明。

该函数的返回值为 base-variable(基准变量)。

若最终形成的变量定义链出现循环引用,Emacs 会抛出 cyclic-variable-indirection(循环变量间接引用)错误。

变量别名可便捷地实现「用新名称替换变量旧名称」的需求。 make-obsolete-variable 函数会标记某个变量的旧名称为「已过时」, 这意味着该旧名称可能会在未来的某个版本中被移除。

Function: make-obsolete-variable obsolete-name current-name when &optional access-type

该函数会让字节编译器发出警告,提示变量 obsolete-name(过时名称)已过时。 若 current-name 是一个符号,则代表该变量的新名称;此时警告信息会提示应使用 current-name 替代 obsolete-name。若 current-name 是一个字符串, 则该字符串会直接作为警告信息,且表示无替代变量。when 参数应为一个字符串, 用于说明该变量首次被标记为过时的时间(通常是版本号字符串)。

可选参数 access-type 若为非 nil 值,需指定触发过时警告的变量访问类型; 其取值可以是 get(读取)或 set(赋值)。

你可通过宏 define-obsolete-variable-alias 同时实现两个变量的同义绑定, 并将其中一个标记为过时。

Macro: define-obsolete-variable-alias obsolete-name current-name when &optional docstring

该宏会将变量 obsolete-name 标记为过时,同时将其设为变量 current-name 的别名。 它等价于以下代码:

(defvaralias obsolete-name current-name docstring)
(make-obsolete-variable obsolete-name current-name when)

该宏会对其所有参数进行求值,且 obsolete-name(过时名称)和 current-name(新名称)都必须是符号类型,因此典型用法如下:

(define-obsolete-variable-alias 'foo-thing 'bar-thing "27.1")
Function: indirect-variable variable

该函数会返回 variable(变量)的别名链末端对应的变量。 若 variable 不是符号类型,或未被定义为别名,则该函数直接返回 variable 本身。

(defvaralias 'foo 'bar)
(indirect-variable 'foo)
     ⇒ bar
(indirect-variable 'bar)
     ⇒ bar
(setq bar 2)
bar
     ⇒ 2
foo
     ⇒ 2
(setq foo 0)
bar
     ⇒ 0
foo
     ⇒ 0

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike