混淆了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不是必需的,但使用户的生活更容易。 -
defcustom
build立在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标记为用户希望能够通过customize
function进行安全修改的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-value
function。 -
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参数,也不是由一个let
forms或类似的声明),也没有定义一个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