每个 Emacs Lisp 软件包都应拥有一个主自定义组,用于包含该包中的所有选项、面孔和其他子组。如果软件包的选项和面孔数量较少,只需创建一个组并将所有内容放入其中即可。当选项和面孔数量超过二十个左右时,应当将它们组织为多个子组,并把这些子组放在软件包的主自定义组下。也可以将部分选项和面孔与子组并列,直接放在主组中。
软件包的主组(或唯一组)应当隶属于一个或多个标准自定义组。(如需查看完整列表,可使用 M-x customize。)选择其中一个或多个(但不要过多),并通过 :group 关键字将你定义的组加入这些标准组中。
声明新自定义组的方式是使用 defgroup。
将 group 声明为包含 members 的自定义组。符号 group 不需要加引号。参数 doc 为该组指定文档字符串。
参数 members 是一个列表,用于指定一组初始的自定义项作为该组的成员。但在绝大多数情况下,members 会设为 nil,你可以在定义各个成员时,通过 :group 关键字将它们加入该组。
如果你希望通过 members 直接指定组成员,那么每个元素的格式应为(name widget)。其中 name 是一个符号,widget 是用于编辑该符号的组件类型。常用的组件有:变量使用 custom-variable,面孔使用 custom-face,组使用 custom-group。
当你在 Emacs 中新增一个组时,只需在 defgroup 中使用 :version 关键字即可,该组下的各个成员无需再单独使用它。
除了通用关键字(see 通用项关键字)之外,你还可以在 defgroup 中使用以下关键字:
:prefix prefix ¶如果组中某个项的名称以 prefix 开头,并且可定制变量 custom-unlispify-remove-prefixes的值为非 nil,那么该项的显示标签将会省略 prefix。一个组可以设置任意多个前缀。
一个组所包含的变量、面孔和子组,都存储在该组符号的 custom-group 属性中。See 访问符号属性。该属性的值是一个点对列表,每个元素的 car 是变量、面孔或子组的符号,cdr 是对应的类型符号:custom-variable、custom-face 或 custom-group。
如果该变量的值为非 nil,那么当用户在自定义界面中设置该组时,由组的 :prefix 关键字指定的前缀将会从标签名称中省略。
该变量的默认值为 nil,即省略前缀的功能是关闭的。这是因为省略前缀常常会导致选项和面孔的名称变得令人困惑。