4

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>”。

定制系统中是否有一些标准方法来处理部分无效值?我在文档中找不到任何内容。¹


¹ http://www.gnu.org/software/emacs/manual/html_node/elisp/Customization-Types.html#Customization-Types

4

2 回答 2

0

您可以编辑(并保存)显示的“原始性别”。我同意如果使用通常的小部件显示有效部分并且只有无效部分显示为“原始性别”会更好。欢迎补丁。

于 2013-06-27T15:16:10.380 回答
0

您可能想要使用/实现小部件的:validate.

来自 Emacs Widget Library – 5 种基本类型(用 阅读C-h i m Widget RET m Basic RET):

':validate' 一个将小部件作为参数的函数,如果小部件的当前值对小部件有效,则返回 'nil'。否则,它应该返回包含无效数据的小部件,并将该小部件的 ':error' 属性设置为解释错误的字符串。

可以使用以下预定义函数:

-- Function: widget-children-validate widget
   All the ‘:children’ of WIDGET must be valid.

在您的示例中,所有正在使用的小部件都应该已经:validate实现,因此您只需应用它。

于 2018-05-21T16:18:25.223 回答