混淆了Emacs自定义系统

有几个类似的设置function:

  1. set&setq
  2. 默认设置
  3. defcustom
  4. 自定义设定值
  5. 自定义设置variables
  6. 自定义设定值
  7. 自定义设置的variables

那么,这些function有什么区别呢?

如果我想将自己的偏好设置为加载项,对于这些情况:

  1. 如果一个variables设置为defcustom,哪个设置函数会更好?
  2. 那么defvar的variables设置呢?

对你的问题的简短答案是:

  • defvar定义的variables使用setqsetq-default

  • 使用setqsetq-default或者由defcustom定义的variables的Customize机制

下面是漫长的答案。

您要使用的function如下:

  • set是设置variables值的主要function。

  • setq是自动引用其第一个参数的另一个版本。 这是有用的,因为引用第一个参数是几乎所有的时候你想要做的事情。

  • 一些variables不能全局设置。 每当你设置variables,它只被设置为当前缓冲区。 如果要模拟全局设置此variables,请使用set-defaultsetq-default

包编写器使用的函数是:

  • defvar ,它允许包装作者定义一个variables并给出一些文档。 此function不是必需的,但使用户的生活更容易。

  • defcustombuild立在defvar 。 它告诉emacs它是一个variables,它允许开发人员创build一个custom接口来设置值。 开发人员可以这样说,比如“这个variables只能包含'foo'或'bar'的值。

设置variables可以用两种方法完成:

  1. 如果使用defvar ,则只能由用户在.emacs使用set函数(或变体) set值,

  2. 如果使用了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-valuecustomize-set-value是指向相同function的两个名称。 他们是使用customize系统的便利方法。
  • custom-set-variablescustomize-set-variables用于使一些通过自定义定制variables活动的集合IIRC。

一般来说,build议使用Mx customize来改变事物。 你可以在你的.emacs使用set或者setq自由地设置defcustom定义的东西,如果你稍后通过customize修改它,定制系统会提醒你。

defcustom通常只用于编写用于发布的软件包,我不认为我曾经见过任何人使用custom-set-*来定制外部文件。 setq在人们的初始化文件中很常见,用于设置他们喜欢他们的方式,而不pipe这些东西是否被标记为用于customize或不customize

我对这一切都没有充分的理解,希望别人能够发现更多的光芒,但我认为这是一个相当不错的概述:P

  1. setsetq是用于分配任何typesvariables的最低级别基元。
  2. set-defaultsetq-default是emacs扩展,与缓冲区本地variables一起使用,以允许设置用于新缓冲区的默认值。 3-7。 所有“自定义”的东西都是后来增加的,它被devise成支持用户界面来pipe理用作用户首选项的variables。
  3. defcustomdefcustom类似,但允许您在选项层次结构中指定一个位置,以及数据types信息,以便UI可以将该值显示为菜单,或自动将用户input转换为适当的types。
  4. 我不认为有一个custom-set-valuefunction。
  5. custom-set-variables定义用户界面在保存所有用户的选项时使用custom-set-variables 。 它列出了用户从默认值更改的所有variables。 6-7。 custom-set-value定义用户界面使用custom-set-valuecustom-set-variable来提示用户selectvariables的当前值和默认值,并分配它们。 你通常不会自己调用这个。

除此之外,由于引入了词汇绑定,这些命令之间的差异已经增加了,但是如果您只想定制一些variables,那么这些差异就不会真正相关。

def...结构声明全局variables。 set...函数设置variables,无论是全局的还是局部的。 当x既不是局部variables(当前函数的forms参数,也不是由一个letforms或类似的声明),也没有定义一个def...forms,而你写(setq x 0) ,字节编译器甚至会显示一个警告

 Warning: assignment to free variable `x' 

defvardefcustomdefconst声明的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