Answers:
该定制系统是内置在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
(删除)按钮,并允许我们在编辑框中编辑字符串值。完成后,我们可以决定是应用更改,还原更改,还是应用并保存更改以供以后的会话使用。
defcustom
)的最大优势在于它可以自动处理:(1)类型检查,以帮助防止您为变量分配错误的值(前提是作者defcustom
努力提供合理的类型检查(2)初始化(:initialize
)和更新(触发)(:set
)。
使用defcustom是执行(可自定义的)全局变量的另一种方式吗?
是。特别是如果您希望代码用户能够通过Mx自定义界面轻松更改变量。
defcustom为用户提供了两个重要的好处:文档编制和类型安全。很高兴能在那里找到文档。类型安全性允许您指定变量可以采用哪种有效值。
当然,如果您所做的只是为自己进行自定义并且不期望使用更广泛,那么defvar很好。但是,有些人会说,始终坚持使用defcustom是一种良好的养成习惯。
谁能指出我如何正确使用...
defcustom的手册页有进一步的说明。手册中的“ 定制”主题具有完整的详细信息。
...何时使用,为什么,何时不使用?
我个人发现defcustom不太麻烦,因为我不必处理defvar和setq的重载问题。
customize
工具,何时手动定制?还是您对编写模式感兴趣?后者是您实际上可能会使用诸如此类defcustom
之类的东西的情况。