在特定模式下设置变量的emacs命令

10

希望在latex模式下设置一个变量。想法是在latex模式下设置的值将覆盖在自定义部分设置的同一变量的值。由于我很新于emacs,以下是我的尝试:

    (add-hook 'LaTeX-mode-hook '(setq line-move-visual t))
    (add-hook 'latex-mode-hook (lambda () (setq line-move-visual t)))

为什么这些不起作用?我应该怎么做?

澄清一下:我希望将变量(setq line-move-visual t)设置为所有其他文件中的(setq line-move-visual nil)。


第二行应该是有效的。你是如何将line-move-visual设置为其他所有内容的nil的?这两个设置可能会互相干扰。 - legoscia
抱歉,刚才意识到你已经在问题中提到了那个。我想不出第二行代码为什么不起作用的原因了... - legoscia
如果您正在使用AUCTeX库而不是内置的tex-mode.el,那么如何尝试一下呢?:(add-hook 'LaTeX-mode-hook (lambda () (setq line-move-visual t)))每个使用AUCTeX的人在开始时都会对钩子感到困惑,因为它们与内置库非常相似:https://www.gnu.org/software/auctex/manual/auctex/Modes-and-Hooks.html - lawlist
@lawlist 感谢大家的帮助,是的,你们说得对,我正在使用auctex,但不知道应该使用不同的钩子。我今天稍后可以测试一下。 - Saad Attieh
1个回答

14

如果您只是在LaTeX-mode-hook中setq变量,它也会影响到任何其他打开的缓冲区。可以让更改仅影响当前缓冲区:


如果您在LaTeX-mode-hook中只是setq变量,则会对任何其他打开的缓冲区产生影响。要使更改仅影响当前缓冲区是可能的:
(add-hook 'LaTeX-mode-hook
      (lambda ()
        (make-local-variable 'line-move-visual)
        (setq line-move-visual nil)))

另外,请注意在Emacs中LaTeX的默认模式的挂钩被称为latex-mode-hook,但是当您使用(更好的)AUCTeX时,挂钩被称为LaTeX-mode-hook

编辑:将make-variable-buffer-local更改为make-local-variable。请参见对此答案的评论。


我认为你想要使用make-local-variable而不是make-variable-buffer-local,后者会影响变量在所有缓冲区中的行为。详情请参考:https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html#index-make_002dvariable_002dbuffer_002dlocal-823。 - Vasiliy Faronov
嗯,我认为你是对的,@VasiliyFaronov。这种方式在我身上已经行之有效了几十年,但可能更多是因为使用不频繁而不是正确性。我编辑了答案。 - Stefan Kamphausen
6
自 Emacs 24.3 版本起,您可以使用 setq-local 替代 make-local-variablesetq 的序列。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接