16

我有几个主要模式(例如:Yaml 和 NXML),我不想要电子缩进模式(我想要它用于类似 C 的语言),但如果关闭,我将无法关闭。要启用我有:

(electric-indent-mode 1)

来自文档(用于可变电缩进模式)

如果启用了 Electric-Indent 模式,则为非 nil。参见命令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“Easy Customization”)或调用函数“electric-indent-mode”。

和一个功能

切换即时重新缩进(电动缩进模式)。使用前缀参数 ARG,如果 ARG 为正则启用 Electric Indent 模式,否则禁用它。如果从 Lisp 调用,如果 ARG 被省略或为零,则启用该模式。

所以我尝试将其关闭:

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

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

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

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

没有喜悦。但是当我(electric-indent-mode -1)从 .emacs 文件进行评估时它会起作用。

4

3 回答 3

17

使用最近的 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)))
于 2014-01-17T10:07:48.867 回答
4

electric-indent-mode将在 24.4 中默认启用。要在本地将其关闭,您将能够使用electric-indent-local-modelunaryorn 提到的。但要在 24.3 本地关闭它,您可以执行以下操作:

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

您提到第一种形式对您不起作用,但它应该(即,如果它不起作用,那是因为其他一些问题)。

于 2014-01-17T14:01:09.553 回答
2

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

试试这个来禁用电子缩进功能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)
于 2014-01-17T10:29:35.387 回答