47

有几个类似的设置功能:

  1. 设置和设置
  2. 默认设置
  3. 自定义
  4. 自定义设置值
  5. 自定义设置变量
  6. 自定义设置值
  7. 自定义设置变量

那么,这些功能有什么区别呢?

如果我想将自己的偏好设置为附加组件,对于这些场景:

  1. 如果通过 defcustom 设置变量,哪个设置功能会更好?
  2. 那么 defvar 的变量设置呢?
4

4 回答 4

63

对您的问题的简短回答是:

  • 使用setqorsetq-default定义的变量defvar

  • 使用setq, setq-default, 或Customize定义的变量的机制defcustom

以下是长答案。

您将要使用的功能如下:

  • set是设置变量值的主要函数。

  • setq是另一个自动引用其第一个参数的版本。这很有用,因为引用第一个参数是您几乎一直想做的事情。

  • 有些变量不能全局设置。每当您设置变量时,它只会为当前缓冲区设置。如果要模拟全局设置此变量,请使用set-defaultor setq-default

包编写器使用的功能是:

  • defvar它允许包编写者定义一个变量并提供一些文档。此功能不是必需的,但可以使用户的生活更轻松。

  • defcustom建立在defvar. 它告诉 emacs 它是一个变量,它允许开发人员创建一个custom接口来设置值。开发人员可以说,“这个变量只能包含值 'foo 或 'bar”。

设置变量可以通过两种方式完成:

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

  2. 如果defcustom使用了,则可以使用set(参见 1.)或使用Customize. 当使用自定义机制时,emacs 会生成一些代码,它会放置在custom-set-variables. 用户不应使用此功能。

于 2012-08-21T16:28:57.577 回答
10

它们基本上都是通向同一事物的途径。虽然有一些重要的区别。了解它们的最佳方式是阅读 Emacs 和 Elisp 的手册(请参阅C-h i)。不过,头顶上:

  • set是一个“低级”的变量赋值
  • (setq foo bar)是简写(set (quote foo) bar)
  • (set-default foo bar)foo表示“除非在当前缓冲区中有更明确的范围定义,否则使用值 bar”,并适用于所有缓冲区。
  • defcustom用于将变量标记为期望用户能够通过该customize功能安全地修改的变量。
  • custom-set-valuecustomize-set-value是两个指向同一个函数的名字。它们是使用customize系统的便捷方法。
  • custom-set-variablescustomize-set-variables用于激活一些通过定制的定制变量,IIRC。

一般来说,建议使用M-x customize来改变周围的事物。您可以自由设置defcustom使用setsetq在您.emacs的 中定义的内容,如果您稍后更改它,自定义系统会警告您customize

defcustom通常仅由编写用于分发的软件包的人使用,而且我认为我没有见过有人custom-set-*在内部文件之外使用来自定义。setq在人们的初始化文件中很常见,用于设置他们喜欢的东西,无论这些东西是否标记为使用customize

我对这一切都没有完全理解,希望其他人可以提供更多的信息,但我认为这是一个相当不错的概述:P

于 2012-08-21T16:30:52.807 回答
5
  1. set并且setq是用于分配任何类型变量的最低级别的原语。
  2. set-default并且setq-default是与缓冲区局部变量一起使用的 emacs 扩展,以允许设置用于新缓冲区的默认值。3-7。所有“自定义”内容都是后来添加的,旨在支持用于管理旨在用作用户首选项的变量的用户界面。
  3. defcustom类似于defvar,但允许您指定选项层次结构中的位置以及数据类型信息,以便 UI 可以将值显示为菜单,或自动将用户输入转换为适当的类型。
  4. 我认为没有custom-set-value功能。
  5. custom-set-variables保存所有用户的选项时由自定义 UI 使用。它列出了用户从默认值更改的所有变量。6-7。custom-set-value并由custom-set-variable自定义 UI 用于提示用户选项变量的当前值和默认值,并分配它们。您通常不会自己调用它。
于 2012-08-21T16:45:27.197 回答
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))

wheremy-local-var没有全局值,则some-function不会看到分配的值,因为它是词法范围的。

另一方面,动态范围的变量不会被捕获到词法闭包中。

更多细节可以在http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html中看到

于 2013-06-27T12:50:22.677 回答