【问题标题】:electric-indent-mode breaks my Python code电动缩进模式破坏了我的 Python 代码
【发布时间】:2013-06-13 19:16:28
【问题描述】:

我在启用了python-mode 的 Emacs 上有这段代码:

def func(a):
    if a:
        return True
    return False

当我在return Falsedef func( 之间移动光标时,代码会自动缩进,破坏它:

def func(a):
    if a:
        return True
        return False #Oops!

我知道这是因为electric-indent-mode,这是一种次要的全局模式。但是,我尝试将其关闭,但问题仍然存在。

我使用的 elisp 代码是这样的:

(defun disable-electric-indent ()
  (set (make-local-variable 'electric-indent-functions)
       (list (lambda (arg) 'no-indent))))

这就是我的python-mode-hook 的样子:

(add-hook 'python-mode-hook
          (lambda ()
              (flyspell-prog-mode)
              (auto-complete-mode)
              (nlinum-mode)
              (toggle-truncate-lines t)
              (setq autopair-handle-action-fns
                    (list 'autopair-default-handle-action 'autopair-python-triple-quote-action))
              (centered-cursor-mode)
              (auto-indent-mode)
              (autopair-mode)
              (column-marker-1 80)
              (flycheck-mode)
              (setq ac-auto-start 2)
              (disable-electric-indent) ;; esto deberia hacer que emacs deje de romper las pelotas con el codigo en python
              (jedi:setup)))

如果我关闭auto-indent-mode,这种行为就会停止(但是,我没有自动缩进,gol)。

我的 emacs 版本:GNU Emacs 24.3.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.8.1) of 2013-04-29 on eric

编辑:根据 melpa 的说法,我在其版本 0.24.2 中使用 python 包(内置 Python 对 Emacs 的飞行马戏团支持)。也许我应该删除它并在其版本 6.0.10 中使用 python-mode 包?

【问题讨论】:

  • 如果引用 python-mode.el,请通过 bazaar 尝试当前主干,bzr 分支 lp:python-mode,resp。从launchpad.net/python-mode下载
  • 实际上,如果我使用python-mode.el,这种行为就会消失。我现在对该软件包有一些小问题,但没有什么是我无法解决的关键问题,谢谢! (请您的评论作为答案!)
  • 习惯C-j而不是RET,或者将RET绑定到newline-and-indent。这会给你自动缩进。
  • @JorgeArayaNavarro 即使有小问题,也不要犹豫,在https://bugs.launchpad.net/python-mode 提交报告/请求。这将对我们和其他人有所帮助。

标签: emacs elisp python-mode


【解决方案1】:

你不妨试试

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

【讨论】:

  • 显然,你还需要调用这个函数。或者只是将set 添加到您的python-mode-hook。但是如果你在electric-indent-mode 为 nil 时仍然看到问题,那么问题很可能不在电子缩进模式下。可能是auto-indent-mode
  • @mzuther 是电动缩进模式还是自动缩进模式的问题?
  • 如果代码 sn-p 解决了他的问题,那么问题出在electric-indent-mode,我想。
  • @Sampath Kumar Rao:我还没有安装auto-indent-mode,所以肯定是electric-indent-mode。如果重要的话,我的 Emacs 版本是 24.4.1 (i686-pc-mingw32)。
【解决方案2】:

假设有一个错误,它不应该像您的示例所示那样缩进。

除此之外,自动缩进模式会产生一些冲突,认为它对 python 模式是一件坏事。不是在您的示例中,但在其他地方,缩进只是一个选择。自动缩进不知道在哪里缩进。 作为换行和缩进,它将选择最可能的,这在某些情况下是错误的。这可能会变得很糟糕。

【讨论】:

    【解决方案3】:

    我刚刚迁移到python-mode.el 并留下代码来关闭electric-indent-mode :)

    【讨论】:

    • 恭喜!顺便说一句,那里提供了几个电气功能。当对共同程序感到宾至如归时,请尝试py-electric-backspace - 例如在编辑列表时。
    【解决方案4】:

    您应该在不应该发生重新缩进的任何模式下使用(setq electric-indent-inhibit t),例如python模式。这是官方的做法,如C-h v electric-indent-inhibit中的文档。

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多