在Emacs Python模式下,缩进错误退出。

7

我正在使用Emacs的python-mode。 我在我的.emacs文件中使用以下命令来调用它:

(add-to-list 'load-path "~/emacs/python-mode.el-6.0.3/")
(autoload 'python-mode "python-mode" "Python Mode." t)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))
(require 'python-mode)
(add-hook 'python-mode-hook
      (lambda ()
    (set-variable 'py-indent-offset 4)
    ;(set-variable 'py-smart-indentation nil)
    (set-variable 'indent-tabs-mode nil)
    (define-key py-mode-map (kbd "RET") 'newline-and-indent)
    ;(define-key py-mode-map [tab] 'yas/expand)
    ;(setq yas/after-exit-snippet-hook 'indent-according-to-mode)
    ))

通常情况下,它的缩进是正常的,如果我写了:

if condition:

当我按下回车键时,它确实将光标放在新的缩进换行符中。问题是,它不能正确地退出缩进。在其他系统中,当我在缩进子句的正文(如if语句正文)中新建一行并按下退格键时,它会跳出一个缩进级别,而不是后退。例如,如果我有:

if condition: 
  statement1
  statement2

当我在语句2后按回车或删除键时,光标会出现在这里:

if condition: 
  statement1
  statement2
<-- cursor position

如果你有许多缩进级别并且它没有自动缩进,那么编辑Python将变得不可能,因为你必须手动删除退格直到达到正确的缩进级别...这很容易出错和令人烦恼,例如,如果你有:
for something:
  for other:
    if hello:
      while x:
         statement1
         <-- How to indent back to level of "for other"?
编辑: 当我以"emacs -nw"方式运行时(我是远程登录服务器,不想启动X界面),我无法让它正常工作。当我删除“-nw”并使用较慢的远程X界面时,一切都可以正常工作...有任何想法为什么会这样吗?这可能与退格或类似问题相关的shell配置问题有关吗?
如何解决这个问题?我只希望在子句中使用缩进级别时进行退格。谢谢。
5个回答

5
对于现代版本的Emacs,请使用python.el,而不是python-mode.el。 如果您从.emacs文件中删除所有这些行,我认为python.el将默认启用,并且当您打开.py文件时,您将获得Python模式。
我在我的系统上测试了空白默认设置,退格键可以正确地返回到示例的一个缩进级别。
所以答案似乎是“什么都不用做!” :)
在Ubuntu上,python.el由emacs23-common软件包提供,该软件包是标准emacs安装的一部分:
% dpkg -S /usr/share/emacs/23.3/lisp/progmodes/python.elc
emacs23-common: /usr/share/emacs/23.3/lisp/progmodes/python.elc

我在Linux上使用GNU Emacs 23.1.1(GTK+版本2.20.1),它并不会表现出这种情况。我从.emacs文件中删除了你提到的内容,重新加载后,尽管默认情况下我可以获得语法高亮和一些缩进,但退格键仍然对缩进不敏感,只是普通的退格键。 - user248237
那么看起来你的.emacs文件中有其他干扰项。尝试使用emacs --no-init-file命令启动emacs。当我以这种方式启动emacs时,在Ubuntu 11.10,GNU Emacs 23.3.1 (GTK+ version 2.24.5)上退格键可以正常工作。 - unutbu
即使没有初始化文件,在我的情况下它也无法工作,我得不到正确的缩进。 - user248237
1
我认为https://dev59.com/xXVC5IYBdhLWcg3w4VRz#157074现在已经不再适用了。python-mode.el支持三引号,开始集成ipython等。自去年以来,它的开发变得非常活跃。 - tkf

1

这是一个错误。

py-smart-indentation 最近一直猜测值为 4,这是错误的。

为了快速解决问题,请在以下位置报告 python-mode.el 的错误:

https://bugs.launchpad.net/python-mode


1

不要使用退格键,只需按下<tab>键。它应该跳到下一个逻辑缩进位置。


1

我猜测python-mode.el不支持不同的缩进宽度。你最后的例子使用了2个3个空格进行缩进。为什么不总是使用每个缩进4个空格呢?使用4个空格是标准风格

编辑:当我打开一个新文件并复制您的最后一个示例时,我可以重现您所说的情况。但是,当我关闭它并重新打开它时,我可以正确地退出缩进。我可以通过选择代码并按下C-c :(py-guess-indent-offset)而无需关闭/重新打开来完成相同的操作。


我认为这与缩进的#空格无关,因为当我从头开始创建新文件时,它由Python/Emacs模式指定,并且问题仍然存在。如果我不使用“-nw”标志运行emacs,则问题会消失,这使我认为这是Mac OS X shell和远程服务器之间的交互问题。你怎么看? - user248237
在终端中,一些关键序列的作用是不同的。我不确定,但如果我没记错的话,TAB就是其中之一。有一种方法可以解决这个问题,但可能python-mode没有实现它。 - tkf

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接