使用 defcustom 定义用户选项时,必须指定其 定制类型(customization type)。定制类型是一个 Lisp 对象,它描述了两点:(1) 该选项的合法取值范围;(2) 在定制缓冲区中如何显示并编辑该选项的值。
在 defcustom 中,通过 :type 关键字指定定制类型。:type 的参数会被求值,但仅在 defcustom 执行时求值一次,因此让该值动态变化并无实际意义。通常我们会使用带引用的常量,例如:
(defcustom diff-command "diff" "The command to use to run diff." :type '(string) :group 'diff)
一般来说,定制类型是一个列表,其第一个元素是一个符号,即后续章节中定义的某一个定制类型名称。在该符号之后,可以根据符号的含义跟随若干个参数。在类型符号与其参数之间,你还可以可选地写入「关键字‑值」对(see 类型关键字)。
有些类型符号不使用任何参数,这类符号被称为 简单类型(simple types)。对于简单类型,如果你不使用任何「关键字‑值」对,可以省略包围类型符号的括号。例如,直接将 string 作为定制类型,等价于 (string)。
所有定制类型均以部件(widget)的形式实现;更多参见 Introduction in The Emacs Widget Library