我有几个主要模式(如:Yaml 和 NXML),我不想要电缩进模式(我想要它用于 C 类语言),但如果关闭我无法关闭。要启用我,我有:
(electric-indent-mode 1)
来自文档(用于可变电动缩进模式)
如果启用了电缩进模式,则为非 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
轻松自定义') 或调用函数"电动缩进模式"。
和函数
切换即时缩进(电动缩进模式)。带前缀 参数 ARG,如果 ARG 为正,则启用电缩进模式,以及 否则禁用它。 如果从 Lisp 调用,如果 ARG 为 省略或为零。
所以我尝试在钩子中关闭它:
(add-hook 'yaml-mode-hook (lambda ()
(electric-indent-mode -1)))
(实际上我使用更改后的主要模式钩子并检查(memql major-mode '(yaml-mode python-mode nxml-mode))
我可以向列表中添加更多模式的位置)。
但它不起作用,我也尝试过:
(set (make-local-variable 'electric-indent-mode) nil)
没有快乐。但是当我从 .emacs 文件中评估(electric-indent-mode -1)
时它可以工作。
使用最近的 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)))
electric-indent-mode
将在 24.4 中默认启用。 要在本地关闭它,您将能够使用 lunaryorn 提到的electric-indent-local-mode
。 但是要在 24.3 中本地关闭它,您可以执行以下操作:
(add-hook 'foo-mode-hook
(lambda () (set (make-local-variable 'electric-indent-mode) nil)))
你提到第一种形式对你不起作用,但它应该(即,如果它不起作用,那是因为其他一些问题)。
至少在 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)