Emacs 如何为defcustom定义的变量设置缓冲区局部值?

Emacs 如何为defcustom定义的变量设置缓冲区局部值?,emacs,elisp,Emacs,Elisp,在emacs中,我们可以定义可自定义的用户选项变量 Emacs Lisp中的自定义编程 我们可以使变量具有缓冲区局部绑定 创建本地缓冲区-GNU Emacs Lisp参考手册 如果我想生成不可自定义的变量,我可以使用makelocalvariable或setqlocal 但我找不到任何方法来使可定制变量具有缓冲区本地绑定 即使我为defcustom定义的变量调用make local variable,custom set variables设置为全局值 如果我调用setq local,则该值设置

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

Emacs Lisp中的自定义编程

我们可以使变量具有缓冲区局部绑定

创建本地缓冲区-GNU Emacs Lisp参考手册

如果我想生成不可自定义的变量,我可以使用
makelocalvariable
setqlocal

但我找不到任何方法来使可定制变量具有缓冲区本地绑定

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

如果我调用
setq local
,则该值设置为local variable。这样更好。但我认为这不是最好的做法


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

在defcustom表单写入之后

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

现在,如果更改某个缓冲区中的值,其他缓冲区将保持resp。交付旧的定制用户界面。

答案是:你不能,至少不使用定制用户界面

您可以做的是添加一个sexp,将变量的缓冲区局部值设置到init文件中

执行以下操作之一:

  • 使其始终为本地缓冲区,无论缓冲区是什么:

    (使变量缓冲区成为本地变量)

    你可以把它放在你的初始化文件中

  • 仅针对当前缓冲区将其设为本地缓冲区,即,在选择某个缓冲区后,将其设为本地缓冲区:

    (使局部变量成为变量)

    为此,您需要将sexp放入一个sexp中,该sexp选择您想要的缓冲区。例如,这可能是:

    (使用当前缓冲区(获取缓冲区创建“缓冲区名称”)
    (使局部变量成为“变量”)

    假设缓冲区可以合理创建或已经存在。如果执行此操作,请在加载
    自定义文件后执行。也就是说,在您的init文件中,在加载
    自定义文件
    (我推荐)之后,或者,如果您不使用
    自定义文件
    ,则在自定义自动生成的任何代码之后(例如,
    自定义设置变量

    您也可以将
    make局部变量
    sexp放在模式挂钩上,这样每当您处于具有特定模式的缓冲区中时,它就会被执行


综上所述,我在2012年向Emacs开发人员提交了一份报告,要求用户能够使用定制UI设置(并可能保存)用户选项的缓冲区本地值。到目前为止,它睡在“wishlist”类别中。

问题在于定制主要是为持久配置而设计的,即保存在配置文件中的配置,因此它也适用于未来的Emacs会话。但是缓冲区不是持久的:当您重新启动Emacs时,您会得到一个新的缓冲区对象。

因此,“每个缓冲区”的持久定制并不是一个明确定义的概念。另一方面,我们可以/应该为特定于某些主要模式的设置(即“每模式”设置)添加自定义支持。

要(在代码中)为任何变量设置缓冲区局部变量,请使用
setq local
(或
在Emacs 24.3之前使用make local variable
)。这是最佳做法。您的问题实际上是“如何在
defcustom
声明中指定变量应始终为缓冲区局部变量?”?或者“如何使用自定义用户界面为变量设置缓冲区本地值?”@phils对我的语言能力表示抱歉。我想问的是“有没有像be复合
setq local
custom set variables
这样的函数?”。但@Drew给出了全面的答案。谢谢,谢谢你的回答。我不想对可自定义的用户选项变量使用
setq
。我别无选择,只能使用
setq
。我希望您的请求能被接受。我知道当我使用
setq
时,这是可行的。但是我想问一下什么时候使用
自定义设置变量
。对不起,谢谢。谢谢你提供的好信息。自定义在定义用户可配置值时很好。但是我想通过我的插件来控制它们。每次启动
窗口配置更改挂钩
时,我都构思了一个方法调用
自定义设置变量
。但我认为这是肮脏的方式。。。