【问题标题】:python-mode indentation not working upon hitting enterpython-mode 缩进在按回车时不起作用
【发布时间】:2025-12-11 15:25:05
【问题描述】:

我刚刚从 ELPA 安装了python-mode,当我点击 Enter 时,光标直接转到下一行的开头。比如下面的代码:

def hello_world():
    print "hello world!"
    for i in range(3):
        print "hello again"
    return 0

每次按 Enter 后,我都必须在 Enter 之后按 TAB 才能进入换行符(尽管有趣的是 TAB 将光标发送到正确的位置)。

当我安装 python-mode 时,我收到了一些与缩进有关的警告消息,我不太了解 here is a link to those warning messages

【问题讨论】:

  • 最后一次编辑应该在答案部分(通过添加您自己的答案),而不是原始问题的一部分。
  • @hus787 谢谢 - 采纳建议。
  • 您不妨恢复“警告消息”的链接,您在上次编辑时不小心删除了该链接;)

标签: python emacs python-mode


【解决方案1】:

C-j 是我正在寻找的键('newline-and-indent' 命令)。我设法通过在我的 init.el 中放置以下钩子来重新绑定 Enter

(add-hook 'python-mode-hook
          (lambda ()
             (define-key python-mode-map "\r" 'newline-and-indent)))

【讨论】:

  • 仅供人们从这里复制粘贴一段代码:它从末尾缺少一个 ')',这使得 emacs 抱怨 init 文件格式错误。
【解决方案2】:

不确定为什么要安装 python-mode,因为 Emacs 内置了 Python 支持,但我认为这不会影响其余部分。如果您希望 RET 在插入换行符后缩进,您可能喜欢到处都这样,因此您可能希望启用 electric-indent-mode

【讨论】:

  • 为小费干杯 - 我的 emacs 版本没有 python-mode,所以我安装了它。
  • 你确定吗?从 Emacs-22 开始,Emacs 就内置了对 Python 的支持。
【解决方案3】:

尝试使用 C-j 而不是 enter

其实C-j是和(newline-and-indent)绑定的,就是做了题中提到的两个步骤(entertab)。

从版本 24.4.50.1 开始,默认行为已被颠倒,即 enter 在需要时添加换行符和缩进,而 C-j 则不需要。虽然这些键绑定映射到的功能不像上面提到的那样。

【讨论】:

  • @MikeVella 如果 enter 做了 C-j 做的事情,我会觉得有点尴尬。虽然一开始不是这样,但后来在我看来是合乎逻辑的。
  • 好的,我在源代码中找到了关于 C-j 的讨论。现在我将尝试将 RET 重新绑定到 C-j。
  • @MikeVella 我建议你养成使用 C-j 的习惯,因为这样你就不会寻找一个给你一个无缩进换行符的键,不得不使用M-x newline 和其他不那么简单的方法。
  • @hus784 'newline-and-indent' 在猜测我想要哪一行缩进方面做得非常好(例如,在 : 之后缩进,但不是在 print 语句之后缩进“)所以我很高兴重新绑定 RET。