有几个类似的设置功能:
- 设置和设置
- 默认设置
- 自定义
- 自定义设置值
- 自定义设置变量
- 自定义设置值
- 自定义设置变量
那么,这些功能有什么区别呢?
如果我想将自己的偏好设置为附加组件,对于这些场景:
- 如果通过 defcustom 设置变量,哪个设置功能会更好?
- 那么 defvar 的变量设置呢?
对您的问题的简短回答是:
使用setq
orsetq-default
定义的变量defvar
。
使用setq
, setq-default
, 或Customize
定义的变量的机制defcustom
以下是长答案。
您将要使用的功能如下:
set
是设置变量值的主要函数。
setq
是另一个自动引用其第一个参数的版本。这很有用,因为引用第一个参数是您几乎一直想做的事情。
有些变量不能全局设置。每当您设置变量时,它只会为当前缓冲区设置。如果要模拟全局设置此变量,请使用set-default
or setq-default
。
包编写器使用的功能是:
defvar
它允许包编写者定义一个变量并提供一些文档。此功能不是必需的,但可以使用户的生活更轻松。
defcustom
建立在defvar
. 它告诉 emacs 它是一个变量,它允许开发人员创建一个custom
接口来设置值。开发人员可以说,“这个变量只能包含值 'foo 或 'bar”。
设置变量可以通过两种方式完成:
如果defvar
使用,则只能由用户.emacs
通过使用set
函数(或变体)在其中设置值
如果defcustom
使用了,则可以使用set
(参见 1.)或使用Customize
. 当使用自定义机制时,emacs 会生成一些代码,它会放置在custom-set-variables
. 用户不应使用此功能。
它们基本上都是通向同一事物的途径。虽然有一些重要的区别。了解它们的最佳方式是阅读 Emacs 和 Elisp 的手册(请参阅C-h i)
。不过,头顶上:
set
是一个“低级”的变量赋值(setq foo bar)
是简写(set (quote foo) bar)
(set-default foo bar)
foo
表示“除非在当前缓冲区中有更明确的范围定义,否则使用值 bar”,并适用于所有缓冲区。defcustom
用于将变量标记为期望用户能够通过该customize
功能安全地修改的变量。custom-set-value
和customize-set-value
是两个指向同一个函数的名字。它们是使用customize
系统的便捷方法。custom-set-variables
并customize-set-variables
用于激活一些通过定制的定制变量,IIRC。一般来说,建议使用M-x customize
来改变周围的事物。您可以自由设置defcustom
使用set
或setq
在您.emacs
的 中定义的内容,如果您稍后更改它,自定义系统会警告您customize
。
defcustom
通常仅由编写用于分发的软件包的人使用,而且我认为我没有见过有人custom-set-*
在内部文件之外使用来自定义。setq
在人们的初始化文件中很常见,用于设置他们喜欢的东西,无论这些东西是否标记为使用customize
。
我对这一切都没有完全理解,希望其他人可以提供更多的信息,但我认为这是一个相当不错的概述:P
set
并且setq
是用于分配任何类型变量的最低级别的原语。set-default
并且setq-default
是与缓冲区局部变量一起使用的 emacs 扩展,以允许设置用于新缓冲区的默认值。3-7。所有“自定义”内容都是后来添加的,旨在支持用于管理旨在用作用户首选项的变量的用户界面。defcustom
类似于defvar
,但允许您指定选项层次结构中的位置以及数据类型信息,以便 UI 可以将值显示为菜单,或自动将用户输入转换为适当的类型。custom-set-value
功能。custom-set-variables
保存所有用户的选项时由自定义 UI 使用。它列出了用户从默认值更改的所有变量。6-7。custom-set-value
并由custom-set-variable
自定义 UI 用于提示用户选项变量的当前值和默认值,并分配它们。您通常不会自己调用它。另外,由于引入了词法绑定,这些命令之间的差异增加了,尽管如果您只想自定义一些变量,这些差异实际上并不相关。
构造def...
声明全局变量。这些set...
函数设置变量,无论是全局变量还是局部变量。何时x
既不是局部变量(当前函数的形式参数或由let
表单或类似声明)也不是由def...
表单定义,并且您编写(setq x 0)
字节编译器甚至会显示警告
Warning: assignment to free variable `x'
defvar
用, defcustom
,声明的变量defconst
是动态绑定的,即当你有一个构造时
(let ((lisp-indent-offset 2))
(pp (some-function)))
该函数some-function
将看到全局变量的变化lisp-indent-offset
。
当变量未动态绑定时,例如
(let ((my-local-var 1))
(some-function))
wheremy-local-var
没有全局值,则some-function
不会看到分配的值,因为它是词法范围的。
另一方面,动态范围的变量不会被捕获到词法闭包中。
更多细节可以在http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html中看到