混淆了Emacs自定义系统
有几个类似的设置function:
- set&setq
- 默认设置
- defcustom
- 自定义设定值
- 自定义设置variables
- 自定义设定值
- 自定义设置的variables
那么,这些function有什么区别呢?
如果我想将自己的偏好设置为加载项,对于这些情况:
- 如果一个variables设置为defcustom,哪个设置函数会更好?
- 那么defvar的variables设置呢?
对你的问题的简短答案是:
-
对
defvar定义的variables使用setq或setq-default。 -
使用
setq,setq-default或者由defcustom定义的variables的Customize机制
下面是漫长的答案。
您要使用的function如下:
-
set是设置variables值的主要function。 -
setq是自动引用其第一个参数的另一个版本。 这是有用的,因为引用第一个参数是几乎所有的时候你想要做的事情。 -
一些variables不能全局设置。 每当你设置variables,它只被设置为当前缓冲区。 如果要模拟全局设置此variables,请使用
set-default或setq-default。
包编写器使用的函数是:
-
defvar,它允许包装作者定义一个variables并给出一些文档。 此function不是必需的,但使用户的生活更容易。 -
defcustombuild立在defvar。 它告诉emacs它是一个variables,它允许开发人员创build一个custom接口来设置值。 开发人员可以这样说,比如“这个variables只能包含'foo'或'bar'的值。
设置variables可以用两种方法完成:
-
如果使用
defvar,则只能由用户在.emacs使用set函数(或变体)set值, -
如果使用了
defcustom,则可以使用set(请参阅1.)或使用Customize来设置值。 当使用自定义机制时,emacs将生成一些代码,它将放置在custom-set-variables。 用户不应该使用这个function。
他们基本上都是通往同一事物的道路。 虽然有一些重要的区别。 了解它们的最好方法是阅读Emacs和Elisp手册(参见第一Ch i) 。 尽pipe如此:
-
set是一个“低级”variables赋值 -
(setq foo bar)简写为(set (quote foo) bar) -
(set-default foo bar)意思是“除非在当前缓冲区中有更明确的foo范围的定义,使用值栏”,并且适用于所有的缓冲区。 -
defcustom用于将variables标记为用户希望能够通过customizefunction进行安全修改的variables。 -
custom-set-value和customize-set-value是指向相同function的两个名称。 他们是使用customize系统的便利方法。 -
custom-set-variables和customize-set-variables用于使一些通过自定义定制variables活动的集合IIRC。
一般来说,build议使用Mx customize来改变事物。 你可以在你的.emacs使用set或者setq自由地设置defcustom定义的东西,如果你稍后通过customize修改它,定制系统会提醒你。
defcustom通常只用于编写用于发布的软件包,我不认为我曾经见过任何人使用custom-set-*来定制外部文件。 setq在人们的初始化文件中很常见,用于设置他们喜欢他们的方式,而不pipe这些东西是否被标记为用于customize或不customize 。
我对这一切都没有充分的理解,希望别人能够发现更多的光芒,但我认为这是一个相当不错的概述:P
-
set和setq是用于分配任何typesvariables的最低级别基元。 -
set-default和setq-default是emacs扩展,与缓冲区本地variables一起使用,以允许设置用于新缓冲区的默认值。 3-7。 所有“自定义”的东西都是后来增加的,它被devise成支持用户界面来pipe理用作用户首选项的variables。 -
defcustom与defcustom类似,但允许您在选项层次结构中指定一个位置,以及数据types信息,以便UI可以将该值显示为菜单,或自动将用户input转换为适当的types。 - 我不认为有一个
custom-set-valuefunction。 -
custom-set-variables定义用户界面在保存所有用户的选项时使用custom-set-variables。 它列出了用户从默认值更改的所有variables。 6-7。custom-set-value定义用户界面使用custom-set-value和custom-set-variable来提示用户selectvariables的当前值和默认值,并分配它们。 你通常不会自己调用这个。
除此之外,由于引入了词汇绑定,这些命令之间的差异已经增加了,但是如果您只想定制一些variables,那么这些差异就不会真正相关。
def...结构声明全局variables。 set...函数设置variables,无论是全局的还是局部的。 当x既不是局部variables(当前函数的forms参数,也不是由一个letforms或类似的声明),也没有定义一个def...forms,而你写(setq x 0) ,字节编译器甚至会显示一个警告
Warning: assignment to free variable `x'
用defvar , defcustom , defconst声明的variables是dynamic绑定的,即当你有一个构造
(let ((lisp-indent-offset 2)) (pp (some-function)))
函数some-function将会看到全局variableslisp-indent-offset 。
当一个variables没有被dynamic绑定时,就像
(let ((my-local-var 1)) (some-function))
其中my-local-var没有全局值,那么some-function将不会看到赋值,因为它在词汇范围内。
另一方面,dynamic范围的variables不会被捕获到词法closures中。
更多细节可以参见http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html