有几个类似的设置功能:
- 设置和设置
- 默认设置
- 自定义
- 自定义设置值
- 自定义设置变量
- 自定义设置值
- 自定义设置变量
那么,这些功能有什么区别呢?
如果我想将自己的偏好设置为附加组件,对于这些场景:
- 如果通过 defcustom 设置变量,哪个设置功能会更好?
- 那么 defvar 的变量设置呢?
对您的问题的简短回答是:
使用setqorsetq-default定义的变量defvar。
使用setq, setq-default, 或Customize定义的变量的机制defcustom
以下是长答案。
您将要使用的功能如下:
set是设置变量值的主要函数。
setq是另一个自动引用其第一个参数的版本。这很有用,因为引用第一个参数是您几乎一直想做的事情。
有些变量不能全局设置。每当您设置变量时,它只会为当前缓冲区设置。如果要模拟全局设置此变量,请使用set-defaultor 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中看到