如何为defcustom定义的变量设置缓冲区本地值?

时间:2014-02-20 18:57:46

标签: emacs elisp

在emacs中,我们可以定义可自定义的用户选项变量。

  

defcustom - 在Emacs中编程Lisp http://www.gnu.org/software/emacs/manual/html_node/eintr/defcustom.html

我们可以使变量具有缓冲区本地绑定。

  

创建Buffer-Local - GNU Emacs Lisp参考手册http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html#Creating-Buffer_002dLocal

如果我想制作不可自定义的变量,我可以使用make-local-variablesetq-local

但我找不到任何方法如何使自定义变量具有缓冲区本地绑定。

即使我为make-local-variable定义的变量调用defcustomcustom-set-variables设置为全局值

如果我调用setq-local,则将值设置为local-variable。这个比较好。但我认为这不是最佳做法。

有没有什么方法可以为defcustom定义的变量设置缓冲区本地值?

3 个答案:

答案 0 :(得分:7)

答案是:你不能,至少不能使用自定义UI。

你可以做的是添加一个sexp,它将变量的缓冲区本地值设置为你的init文件。

执行以下 一个

  • 无论缓冲区是什么,都要始终缓冲区本地:

    (make-variable-buffer-local 'the-variable)

    您可以将其添加到初始文件中。

  • 只为当前缓冲区设置缓冲区本地,即选择后为某些缓冲区:

    (make-local-variable 'the-variable)

    为此,您需要将sexp放入选择所需缓冲区的sexp中。那可能是,例如:

    (with-current-buffer (get-buffer-create "the-buffer-name") (make-local-variable 'the-variable))

    假设缓冲区可以合理地创建或已经存在。如果您这样做,请在>加载custom-file之后执行此操作。也就是说,在你的init文件中,在加载custom-file(我推荐)之后,或者,如果你不使用custom-file,在Customize自动生成的任何代码之后(例如,custom-set-variables

    您也可以将make-local-variable sexp放在模式挂钩上,因此每当您处于具有特定模式的缓冲区时,它就会被执行。

所有这些都说明了,我在2012年向Emacs Dev提交了enhancement request,要求用户能够使用自定义UI设置(并可能保存)缓冲区 - 用户选项的本地值。到目前为止,它睡在“愿望清单”类别中。

答案 1 :(得分:1)

在defcustom表格后写

(make-variable-buffer-local 'my-var)

现在,如果更改某个缓冲区中的值,其他缓冲区将保持resp。提供旧的定制。

答案 2 :(得分:1)

问题是Customize主要是为持久配置而设计的,即保存在配置文件中的配置,因此它也适用于未来的Emacs会话。但是缓冲区不是持久的:当你重新启动Emacs时,你会得到一个新的缓冲区对象 因此,持久定制“每缓冲区”不是一个明确定义的概念。另一方面,我们可以/应该为特定于某些主要模式的设置添加Customize支持(即“每模式”设置)。