【问题标题】:How can I set buffer-local value for a variable defined by defcustom?如何为 defcustom 定义的变量设置缓冲区局部值?
【发布时间】:2014-02-20 18:57:46
【问题描述】:

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

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

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

创建本地缓冲区 - GNU Emacs Lisp 参考手册http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html#Creating-Buffer_002dLocal

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

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

即使我为 defcustom 定义的变量调用 make-local-variablecustom-set-variables 设置为 global-value

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

是否有任何有效的方法可以为 defcustom 定义的变量设置缓冲区局部值?

【问题讨论】:

  • 要(在代码中)为 any 变量设置缓冲区局部变量,请使用 setq-local(或 Emacs 24.3 之前的 make-local-variable)。这最佳实践。您的问题实际上是“我如何指定 within defcustom 声明变量应该始终是缓冲区本地的?” ?或者也许“如何使用自定义用户界面为变量设置缓冲区本地值?” ?
  • @phils 对不起我的语言能力。我想问的是“有没有像复合setq-localcustom-set-variables这样的功能?”。但是@Drew 发布了全面的答案。谢谢。

标签: emacs elisp


【解决方案1】:

答案是:你不能,至少不能使用自定义 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,在自定义自动生成的任何代码之后(例如,custom-set-variables)。

    您也可以将make-local-variable sexp 放在模式挂钩上,这样只要您在具有特定模式的缓冲区中,它就会被执行。

综上所述,我在 2012 年向 Emacs Dev 提交了 enhancement request,请求用户能够使用自定义 UI 来设置(并可能保存)buffer-local用户选项的值。到目前为止,它属于“愿望清单”类别。

【讨论】:

  • 感谢您的出色回答。我不想将setq 用于可自定义的用户选项变量。我别无选择,只能使用 setq 。希望您的请求能被接受。
【解决方案2】:

自定义表单写入后

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

现在,如果您更改某个缓冲区中的值,其他缓冲区将保持相应。交付旧的定制的。

【讨论】:

  • 我知道当我使用setq 时这可以工作。但是我想问一下什么时候使用custom-set-variables。对不起,谢谢。
【解决方案3】:

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

【讨论】:

  • 感谢您提供的优质信息。在定义用户可配置值时,自定义是很好的。但我想通过我的插件来控制它们。当每次启动window-configuration-change-hook 时,我构想了一种调用custom-set-variables 的方式。但我认为这是肮脏的方式......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多