有几个类似的设置功能:
那么,这些功能有什么区别?
如果我想将自己的首选项设置为加载项,请参阅以下场景:
答案 0 :(得分:62)
您的简短回答是:
对setq
定义的变量使用setq-default
或defvar
。
对setq
setq-default
,Customize
或defcustom
机制
以下是答案很长。
您要使用的功能如下:
set
是设置变量值的主要功能。
setq
是另一个自动引用其第一个参数的版本。这很有用,因为引用第一个参数几乎是你想要做的事情。
某些变量无法全局设置。无论何时设置变量,它都只为当前缓冲区设置。如果您想模拟全局设置此变量,请使用set-default
或setq-default
。
包编写器使用的函数是:
defvar
允许包编写者定义变量并提供一些文档。此功能不是必需的,但可以使用户的生活更轻松。
defcustom
以defvar
为基础。它告诉emacs它是一个变量,它允许开发人员创建一个custom
接口来设置值。开发人员可以说,“这个变量只能包含值'foo或'bar”。
设置变量可以通过两种方式完成:
如果使用defvar
,则只能由用户在其.emacs
中使用set
函数(或变体)设置值
如果使用defcustom
,则可以使用set
(请参阅1.)或使用Customize
设置值。使用自定义机制时,emacs将生成一些代码,它将放在custom-set-variables
中。用户不应使用此功能。
答案 1 :(得分:10)
他们在很大程度上都是通往同一事物的道路。但是有一些重要的区别。了解它们的最佳方法是阅读Emacs和Elisp的手册(参见C-h i)
。尽管如此:
set
是一个“低级”变量赋值(setq foo bar)
是(set (quote foo) bar)
(set-default foo bar)
表示“除非当前缓冲区中有foo
更明确的作用域定义,否则请使用值栏”,并应用于所有缓冲区。defcustom
用于将变量标记为用户希望能够通过customize
功能安全修改的变量。custom-set-value
和customize-set-value
是两个指向相同功能的名称。它们是使用customize
系统的便捷方法。custom-set-variables
和customize-set-variables
用于制作一些自定义的自定义变量,IIRC。一般情况下,建议使用M-x customize
来改变一切。您可以使用defcustom
中的set
或setq
设置使用.emacs
定义的内容,如果您稍后通过{{customize
进行更改,则自定义系统会向您发出警告。 1}}虽然。
defcustom
通常仅供编写用于分发的软件包的人使用,我认为我没有看到任何人在内部文件之外使用custom-set-*
进行自定义。 setq
在人们的初始化文件中很常见,用于设置他们喜欢的方式,无论这些内容是否标记为与customize
一起使用。
我对这一切都没有充分了解,希望其他人可以更多地了解,但我认为这是一个相当不错的概述:P
答案 2 :(得分:5)
set
和setq
是用于分配任何类型变量的最低级基元。set-default
和setq-default
是与缓冲区局部变量一起使用的emacs扩展,以允许设置用于新缓冲区的默认值。
3-7。所有“自定义”内容都是后来添加的,旨在支持用户界面来管理旨在用作用户首选项的变量。defcustom
类似于defvar
,但允许您在选项层次结构中指定一个位置,以及数据类型信息,以便UI可以将值显示为菜单,或自动将用户输入转换为适当的类型。custom-set-value
功能。custom-set-variables
。它列出了用户从默认值更改的所有变量。
6-7。自定义UI使用custom-set-value
和custom-set-variable
来提示用户输入选项变量的当前值和默认值,并分配它们。你通常不会自己打电话。答案 3 :(得分:3)
同样,由于引入了词法绑定,这些命令之间的差异也有所增加,但如果你只想自定义某些变量,这些差异就不会真正相关。
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))
其中my-local-var
没有全局值,然后some-function
将看不到指定的值,因为它是词法范围的。
另一方面,动态范围的变量不会被捕获到词法闭包中。
更多细节可以在http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html
中看到