39.2 定义缩写

define-abbrev 是用于在缩写表中定义缩写的底层基础函数。

当主模式定义系统缩写时,应当调用 define-abbrev,并为 :system 属性指定 t。请注意,所有已保存的非系统缩写会在启动时恢复,也就是在部分主模式加载之前。因此,主模式不应假设首次加载时其缩写表为空。

Function: define-abbrev abbrev-table name expansion &optional hook &rest props

该函数在 abbrev-table 中定义一个名为 name 的缩写,将其展开为 expansion 并调用 hook,同时应用属性 props(see 缩写属性)。返回值为 nameprops 中的 :system 属性会被特殊处理:如果其值为 force,则会覆盖同名非系统缩写的现有定义。

name 应为字符串。参数 expansion 通常是期望的展开内容(字符串),或为 nil 以取消该缩写的定义。如果它既不是字符串也不是 nil,则该缩写仅通过运行 hook 完成展开。

参数 hook 是一个函数或 nil。如果 hooknil,则在缩写被替换为 expansion 后,会无参调用该钩子;调用 hook 时,光标位于 expansion 的末尾。

如果 hook 是一个非 nil 符号,且其 no-self-insert 属性非 nil,则 hook 可以显式控制是否插入触发展开的自插入输入字符。在这种情况下,如果 hook 返回非 nil 值,将禁止插入该字符。相反,如果 hook 返回 nilexpand-abbrev(或 abbrev-insert)也会返回 nil,就像实际上没有发生展开一样。

通常情况下,如果 define-abbrev 实际修改了缩写,会将变量 abbrevs-changed 设置为 t。这样部分命令会提示保存缩写。对于系统缩写,该函数不会执行此操作,因为系统缩写本身不会被保存。

User Option: only-global-abbrevs

如果该变量非 nil,表示用户仅计划使用全局缩写。这会告知定义模式专属缩写的命令,改为定义全局缩写。该变量不会改变本节函数的行为,仅由其调用者检查。