在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-variable
或setq-local
。
但我找不到任何方法如何使自定义变量具有缓冲区本地绑定。
即使我为make-local-variable
定义的变量调用defcustom
,custom-set-variables
设置为全局值。
如果我调用setq-local
,则将值设置为local-variable。这个比较好。但我认为这不是最佳做法。
有没有什么方法可以为defcustom定义的变量设置缓冲区本地值?
答案 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支持(即“每模式”设置)。