对Emacs自定义系统感到困惑

时间:2012-08-21 15:55:19

标签: emacs elisp

有几个类似的设置功能:

  1. set& setq
  2. 设置默认
  3. defcustom
  4. 自定义设定值
  5. 定制设置变量
  6. 定制设定值
  7. 定制设定的变量
  8. 那么,这些功能有什么区别?

    如果我想将自己的首选项设置为加载项,请参阅以下场景:

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

4 个答案:

答案 0 :(得分:62)

您的简短回答是:

  • setq定义的变量使用setq-defaultdefvar

  • setq

  • 定义的变量使用setq-defaultCustomizedefcustom机制

以下是答案很长。

您要使用的功能如下:

  • set是设置变量值的主要功能。

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

  • 某些变量无法全局设置。无论何时设置变量,它都只为当前缓冲区设置。如果您想模拟全局设置此变量,请使用set-defaultsetq-default

包编写器使用的函数是:

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

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

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

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

  2. 如果使用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-valuecustomize-set-value是两个指向相同功能的名称。它们是使用customize系统的便捷方法。
  • custom-set-variablescustomize-set-variables用于制作一些自定义的自定义变量,IIRC。

一般情况下,建议使用M-x customize来改变一切。您可以使用defcustom中的setsetq设置使用.emacs定义的内容,如果您稍后通过{{customize进行更改,则自定义系统会向您发出警告。 1}}虽然。

defcustom通常仅供编写用于分发的软件包的人使用,我认为我没有看到任何人在内部文件之外使用custom-set-*进行自定义。 setq在人们的初始化文件中很常见,用于设置他们喜欢的方式,无论这些内容是否标记为与customize一起使用。

我对这一切都没有充分了解,希望其他人可以更多地了解,但我认为这是一个相当不错的概述:P

答案 2 :(得分:5)

  1. setsetq是用于分配任何类型变量的最低级基元。
  2. set-defaultsetq-default是与缓冲区局部变量一起使用的emacs扩展,以允许设置用于新缓冲区的默认值。 3-7。所有“自定义”内容都是后来添加的,旨在支持用户界面来管理旨在用作用户首选项的变量。
  3. defcustom类似于defvar,但允许您在选项层次结构中指定一个位置,以及数据类型信息,以便UI可以将值显示为菜单,或自动将用户输入转换为适当的类型。
  4. 我认为没有custom-set-value功能。
  5. 保存所有用户选项时,自定义UI使用
  6. custom-set-variables。它列出了用户从默认值更改的所有变量。 6-7。自定义UI使用custom-set-valuecustom-set-variable来提示用户输入选项变量的当前值和默认值,并分配它们。你通常不会自己打电话。

答案 3 :(得分:3)

同样,由于引入了词法绑定,这些命令之间的差异也有所增加,但如果你只想自定义某些变量,这些差异就不会真正相关。

def...构造声明全局变量。 set...函数设置变量,无论是全局变量还是本地变量。当x既不是局部变量(当前函数的形式参数或由let形式或类似声明)也不是由def...形式定义并且您编写(setq x 0)时字节编译器甚至会显示警告

Warning: assignment to free variable `x'

使用defvardefcustomdefconst声明的变量是动态绑定的,即当你有一个构造时

(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

中看到