首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs lisp:“通过”类型的脱节。

Emacs lisp:“通过”类型的脱节。
EN

Stack Overflow用户
提问于 2013-06-27 13:19:47
回答 2查看 583关注 0票数 4

TL;DR

customize系统中是否有一些标准的回退处理,用于处理部分无效的复合自定义变量,例如,一个条目不是缺点的列表?

长版

emacs的自定义机制非常强大,因为它将:type参数组合到defcustom,为定制变量提供了一个漂亮的统一接口。

然而,无论出于什么原因,变量的一个条目都是错误的,整个系统就会崩溃,它只会显示简单的s-表达式。因此,对于删除自定义,希望默认值与类型描述匹配,那么就没有任何帮助来修复这个expect。

至少到目前为止,这就是我所经历的。

如果我有一个自定义变量,它是一个复杂的数据结构,是否有某种机制允许只将变量的损坏部分显示为一个裸的s表达式?

想一想

代码语言:javascript
复制
(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不会显示一个很好的输入掩码。

代码语言:javascript
复制
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

当我现在做了

代码语言:javascript
复制
(add-to-list 'x 1)

该掩码对用户的友好性大大降低。

代码语言:javascript
复制
Hide x: 
'(1
  (org-mode . "a\\|b")
  (text-mode . "b\\|c"))
    State : CHANGED outside Customize. (mismatch)
   Some variable
Groups: X

当然,现在我可以通过将定义更改为以下内容来包含一个备用选项

代码语言:javascript
复制
(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!"))))

,它提供自定义掩码。

代码语言:javascript
复制
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

然而,这现在包括了一个尴尬的下拉菜单,它给用户在条目和无效值之间的选择。相反,我会在默认情况下隐藏下拉值,只有在与有效选项不匹配时才会显示。作为一个用户,我的第一个想法就是“”。

在定制系统中是否有一些标准的方法来处理部分无效值?我在文件里找不到任何东西。

1-1- node/elisp/Customization-Types.html#Customization-Types

EN

回答 2

Stack Overflow用户

发布于 2013-06-27 15:16:10

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

票数 0
EN

Stack Overflow用户

发布于 2018-05-21 16:18:25

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

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

‘:验证一个函数,该函数接受一个小部件作为参数,如果小部件的当前值对小部件有效,则返回’nil‘。否则,它应该返回包含无效数据的小部件,并将该小部件的“:error”属性设置为解释错误的字符串。 可以使用下列预定义函数: -函数:小部件-子-验证小部件的所有“:子”都必须有效。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17344328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档