【问题标题】:How to turn off electric-indent-mode for specific Major mode?如何关闭特定主模式的电子缩进模式?
【发布时间】:2014-02-06 14:03:33
【问题描述】:

我有几个主要模式(例如: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 nodeEasy 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)

没有快乐。但是当我从 .emacs 文件中评估 (electric-indent-mode -1) 时它会起作用。

【问题讨论】:

    标签: emacs elisp major-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)))
    

    【讨论】:

    • 谢谢,这帮助我解决了同样的问题,只是使用 enh-ruby-mode 而不是 yaml-mode。我太习惯使用 C-j 行为了,现在不想改变,但要理解为什么默认情况下启用电子缩进对新手来说可能是件好事。
    【解决方案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)
    

    【讨论】:

    • 我在 NXML 模式下也有同样的问题,我可以在 Yaml 模式下禁用电动模式。但正如你所说,它是全局模式,它不适用于钩子。
    • @jcubic 对于nxml mode,您可以使用(define-key nxml-mode-map "/" nil)
    • 不要为我工作,我从 .emacs 和 nxml 缓冲区运行,什么也没有。当我点击进入当前行时,缩进。
    • 这应该停止在点击enter(add-hook 'nxml-mode-hook (lambda () (add-hook 'electric-indent-functions (lambda (pos) 'no-indent) nil 'local)))时缩进
    • 这不是每次打开nxml-mode都会追加新功能吗?
    【解决方案3】:

    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)))
    

    你提到第一种形式不适合你,但它应该(即如果它不适合,那是因为其他一些问题)。

    【讨论】:

    • 什么反对直接设置electric-indent-functions,就像我的回答一样?
    • 哦,对了,没看到那个,对不起,确实像你一样设置electric-indent-functions也应该可以解决问题。
    • 不要为我工作,当我按回车(或运行new-line)时,当前行会缩进。
    • 我的示例代码仅适用于foo-mode。 “不要为我工作”并没有提供太多关于你实际做了什么的信息,而且我的水晶球正在维修。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2018-09-03
    • 2013-05-27
    相关资源
    最近更新 更多