如何为特定的主要模式转动电动缩进模式?

时间:2014-01-17 09:42:07

标签: emacs elisp major-mode

我有几个主要模式(比如:Yaml和NXML),我不想要电动缩进模式(我希望它用于C语言),但是如果关闭我就无法转动。要启用我:

(electric-indent-mode 1)

来自文档(对于变量电动缩进模式)

  

如果启用电气缩进模式,则为非零。   请参阅命令electric-indent-mode' for a description of this minor mode. Setting this variable directly does not take effect; either customize it (see the info node轻松自定义')   或者调用函数`electric-indent-mode'。

和功能

  

切换动态重新注册(电子缩进模式)。带前缀   参数ARG,如果ARG为正,则启用电子缩进模式   否则禁用它。如果从Lisp调用,则在ARG启用时启用该模式   省略或无。

所以我试着把它关掉:

(add-hook 'yaml-mode-hook (lambda ()                        
                             (electric-indent-mode -1)))

(Actualy我使用after-change-major-mode-hook并检查(memql major-mode '(yaml-mode python-mode nxml-mode))我可以在列表中添加更多模式。)

但它不起作用,我也试过:

(set (make-local-variable 'electric-indent-mode) nil)

没有快乐。但是当我从.emacs文件中评估(electric-indent-mode -1)时,它可以正常工作。

3 个答案:

答案 0 :(得分:12)

使用最近的Emacs(可能仅限Emacs快照),您可以使用electric-indent-local-mode,例如:

(add-hook 'yaml-mode-hook (lambda () (electric-indent-local-mode -1)))

如果您的Emacs缺少此功能,您仍然可以通过electric-indent-functions禁用该模式,例如

(add-hook 'yaml-mode-hook
          (lambda ()
             (add-hook 'electric-indent-functions
                            (lambda () 'no-indent) nil 'local)))

在任何一种情况下,您可能都希望通过

恢复C-j
(add-hook 'yaml-mode-hook 
          (lambda () (local-set-key (kbd "C-j") #'newline-and-indent)))

答案 1 :(得分:4)

默认情况下,将在24.4中启用

electric-indent-mode。要在本地关闭它,您将能够使用lunaryorn提到的electric-indent-local-mode。但是要在24.3中将其关闭,你可以这样做:

(add-hook 'foo-mode-hook
          (lambda () (set (make-local-variable 'electric-indent-mode) nil)))

你提到第一种表格对你不起作用,但它应该(如果没有,那是因为其他一些问题)。

答案 2 :(得分:2)

至少在emacs 24.3上你不能在本地禁用电子缩进模式,因为它是global-mode。无论如何yaml-mode的问题是内置electric-indent功能,即使没有electric-indent-mode也会启用它。该软件包没有提供关闭此行为的方法,也许您应该在其github存储库上提交问题。

尝试此操作以禁用yaml-mode

中的电子缩进功能
(define-key yaml-mode-map "|" nil)
(define-key yaml-mode-map ">" nil)
(define-key yaml-mode-map "-" nil)
(define-key yaml-mode-map "." nil)
(define-key yaml-mode-map [backspace] nil)

要恢复之后的电子缩进行为,您可以

(define-key yaml-mode-map "|" 'yaml-electric-bar-and-angle)
(define-key yaml-mode-map ">" 'yaml-electric-bar-and-angle)
(define-key yaml-mode-map "-" 'yaml-electric-dash-and-dot)
(define-key yaml-mode-map "." 'yaml-electric-dash-and-dot)
(define-key yaml-mode-map [backspace] 'yaml-electric-backspace)