如何正确使用defcustom?


15

像大多数Emacs用户一样,我通过更改变量自定义了模式。对我而言,从未发生过的事情就是可以自定义“那个和那个”。当我开始查看eshell的一些源代码时,我意识到了这一点。我不是elisp程序员,但em-ls.el似乎专门使用defcustomdefgroup等。这似乎是elisp代码使用的全局定义变量的影子世界。因此,一个问题是,是否使用defcustom另一种处理(可自定义的)全局变量的方式?

谁能指出我如何正确使用(首先理解)背后的全部思想defcustom,何时使用,为什么,何时不使用?也许是elisp初学者的初学者示例。


您能澄清您的要求吗?您想知道何时使用这些customize工具,何时手动定制?还是您对编写模式感兴趣?后者是您实际上可能会使用诸如此类defcustom之类的东西的情况。

Answers:


20

定制系统是内置在Emacs的功能正是为了解决你的问题描述编程可能不适合普通用户配置他们的编辑的理想方法。

定制功能的主要入口点是M-x customize RET(或Options > Customize Emacs > Top-level Customization Group从菜单中)。从那里,您将看到用于调整设置的交互式菜单系统。该界面强制所有设置都具有正确的类型(数字,字符串,颜色等),从而避免了用户以编程方式配置Emacs时遇到的主要错误源。如果用户选择保留他们通过UI所做的任何更改,则设置将存储到用户的初始化文件中的特殊部分(请参阅:).emacs

defcustom封装了较低级的Emacs Lisp功能,例如defvar既声明了变量使其在自定义界面中可见。它还允许开发人员提供显示适当的交互式控件所需的额外元数据,即该变量中存储了哪种类型的值?任意字符串?一个号码?从固定选项中进行选择?等defgroup是这些可自定义选项的分组构造,以便可以将它们安排成一个不错的层次结构。

每当应将一条数据视为用户的可配置选项而不是库的内部细节时,都应使用此功能。

这是一个来自我的小型图书馆的简单示例:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

defgroup顶层下的自定义界面中创建一个新的组convenience项目。然后,我需要一个变量来存储可能的复选框状态。本可以使用的defvar,但是由于我希望此按钮易于定制,因此我选择使用defcustom。该:group部分指示它属于先前定义的组,并且:type指示该部分是字符串序列。还有一个默认值和说明。还有其他工具(此处未显示)用于转换用户输入的值。

如果现在运行M-x customize RET并导航到Convenience > Checkbox,则会看到以下信息:

定制界面

它不是世界上最漂亮的界面,但请注意,它具有用于自定义“复选框状态”(checkbox-states内部)值的交互式工具。它显示当前字符串值以及INS(插入)和DEL(删除)按钮,并允许我们在编辑框中编辑字符串值。完成后,我们可以决定是应用更改,还原更改,还是应用并保存更改以供以后的会话使用。


2
好帖子!自定义(和defcustom)的最大优势在于它可以自动处理:(1)类型检查,以帮助防止您为变量分配错误的值(前提是作者defcustom努力提供合理的类型检查(2)初始化:initialize)和更新(触发):set)。
画了

谢谢!我已经更新了帖子以反映您的建议。
camdez

7

使用defcustom是执行(可自定义的)全局变量的另一种方式吗?

是。特别是如果您希望代码用户能够通过Mx自定义界面轻松更改变量。

defcustom为用户提供了两个重要的好处:文档编制和类型安全。很高兴能在那里找到文档。类型安全性允许您指定变量可以采用哪种有效值。

当然,如果您所做的只是为自己进行自定义并且不期望使用更广泛,那么defvar很好。但是,有些人会说,始终坚持使用defcustom是一种良好的养成习惯。

谁能指出我如何正确使用...

defcustom手册页有进一步的说明。手册中的“ 定制”主题具有完整的详细信息。

...何时使用,为什么,何时不使用?

我个人发现defcustom不太麻烦,因为我不必处理defvar和setq的重载问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.