Emacs lisp:defcustom的“Fall through”类型。

时间:2013-06-27 13:19:47

标签: emacs elisp customization fallback fallbackvalue

TL; DR

customize中是否有一些标准后备处理 system,用于处理部分无效的复合定制 变量,例如一个入口不是缺点的alist?

长版

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

然而现在这包括一个尴尬的下拉菜单 使用户可以在条目和无效值之间进行选择。 相反,我默认隐藏下拉值并显示 仅当与有效选项不匹配时。作为用户我的 首先想到看到的就是“ ”。

自定义系统中是否有一些标准方法可以处理 部分无效的价值?我在文档中找不到任何内容.¹


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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可能希望使用/实现小部件的:validate

来自Emacs小部件库 - 5种基本类型(使用C-h i m Widget RET m Basic RET阅读):

  

“:验证”        将小部件作为参数并返回'nil'的函数        如果窗口小部件的当前值对窗口小部件有效。除此以外        它应该返回包含无效数据的小部件,并进行设置        该小部件的':error'属性为解释错误的字符串。

     

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

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

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