TL;博士
系统中是否有一些标准的后备处理customize
,用于处理部分无效的复合定制变量,例如一个条目不是缺点的列表?
长版
emacs 的自定义机制非常强大,它使用复合:type
参数defcustom
为自定义变量提供了一个漂亮的统一接口。
但是,无论出于何种原因,当变量的单个条目出错时,整个系统都会崩溃,它只会显示裸露的 s 表达式。然后,对于删除希望默认值与类型描述匹配的自定义设置,没有任何帮助可以解决此问题。
至少这是我迄今为止所经历的。
如果我有一个复杂数据结构的自定义变量,是否有某种机制允许仅将变量的损坏部分显示为裸 s 表达式?
想想例如
(defcustom x
'((org-mode . "a\\|b")
(text-mode . "b\\|c"))
"Some variable"
:group 'x
:type '(repeat
(cons :tag "Entry"
(function :tag "Mode" :value text-mode)
(regexp))))
通常M-x customize-variable x
不会显示漂亮的输入掩码。
Hide X:
INS DEL Entry:
Mode: org-mode
Regexp: a\|b
INS DEL Entry:
Mode: text-mode
Regexp: b\|c
INS
State : STANDARD.
Some variable
Groups: X
当我现在做
(add-to-list 'x 1)
面具变得非常不友好
Hide x:
'(1
(org-mode . "a\\|b")
(text-mode . "b\\|c"))
State : CHANGED outside Customize. (mismatch)
Some variable
Groups: X
现在我当然可以通过将定义更改为类似的内容来包含一个后备选项
(defcustom x
'((org-mode . "a\\|b")
(text-mode . "b\\|c"))
"Some variable"
:group 'x
:type '(repeat
(choice
(cons :tag "Entry"
(function :tag "Mode" :value text-mode)
(regexp))
(sexp :tag "MISMATCHED ENTRY!"))))
这给出了一个自定义掩码
Hide X:
INS DEL Choice: Value Menu MISMATCHED ENTRY!: 1
INS DEL Choice: Value Menu Entry:
Mode: org-mode
Regexp: a\|b
INS DEL Choice: Value Menu Entry:
Mode: text-mode
Regexp: b\|c
INS
State : CHANGED outside Customize.
Some variable
Groups: X
然而,这现在确实包括一个尴尬的下拉菜单,让用户可以在条目和无效值之间进行选择。相反,我会默认隐藏下拉值,仅在与有效选项不匹配时显示。作为用户,我首先想到的就是“<em>”。
定制系统中是否有一些标准方法来处理部分无效值?我在文档中找不到任何内容。¹