Emacs 如何为defcustom定义的变量设置缓冲区局部值?
在emacs中,我们可以定义可自定义的用户选项变量 Emacs Lisp中的自定义编程 我们可以使变量具有缓冲区局部绑定 创建本地缓冲区-GNU Emacs Lisp参考手册 如果我想生成不可自定义的变量,我可以使用Emacs 如何为defcustom定义的变量设置缓冲区局部值?,emacs,elisp,Emacs,Elisp,在emacs中,我们可以定义可自定义的用户选项变量 Emacs Lisp中的自定义编程 我们可以使变量具有缓冲区局部绑定 创建本地缓冲区-GNU Emacs Lisp参考手册 如果我想生成不可自定义的变量,我可以使用makelocalvariable或setqlocal 但我找不到任何方法来使可定制变量具有缓冲区本地绑定 即使我为defcustom定义的变量调用make local variable,custom set variables设置为全局值 如果我调用setq local,则该值设置
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文件中,在加载
(我推荐)之后,或者,如果您不使用自定义文件
,则在自定义自动生成的任何代码之后(例如,自定义文件
) 您也可以将自定义设置变量
sexp放在模式挂钩上,这样每当您处于具有特定模式的缓冲区中时,它就会被执行make局部变量
综上所述,我在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
时,这是可行的。但是我想问一下什么时候使用自定义设置变量
。对不起,谢谢。谢谢你提供的好信息。自定义在定义用户可配置值时很好。但是我想通过我的插件来控制它们。每次启动窗口配置更改挂钩
时,我都构思了一个方法调用自定义设置变量
。但我认为这是肮脏的方式。。。