在emacs python-mode中不正确地退出缩进

7 python emacs elisp python-mode

我正在使用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)
    ))
Run Code Online (Sandbox Code Playgroud)

它通常缩进没关系,因为如果我写道:

if condition:
Run Code Online (Sandbox Code Playgroud)

然后按Return键,它会正确地将光标放在缩进的换行符中.问题是它没有正确退出缩进.在其他系统中,当我在缩进子句的主体(如if语句体)中创建一个新行并按Backspace时,它会在缩进中跳出一个级别,而不是退格.例如,如果我有:

if condition: 
  statement1
  statement2
Run Code Online (Sandbox Code Playgroud)

然后我按下返回,退格键statement2,它会将光标放在这里:

if condition: 
  statement1
  statement2
<-- cursor position
Run Code Online (Sandbox Code Playgroud)

如果你有许多想法的级别而且它没有这样做,编辑Python变得不可能,因为你必须手动退格,直到你达到正确的缩进级别......它容易出错并且很烦人,例如,如果你有:

for something:
  for other:
    if hello:
      while x:
         statement1
         <-- How to indent back to level of "for other"?
Run Code Online (Sandbox Code Playgroud)

编辑:我无法让emacs运行为"emacs -nw"(我正在远程登录服务器,不希望X接口启动).当我删除"-nw"并使用emacs时,远程使用较慢的X界面,一切正常......任何想法为什么会这样?它可能是与退格或类似的shell配置问题吗?

怎么解决这个问题?如果我在一个子句中,我只想让它在缩进级别退格.谢谢.

unu*_*tbu 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
Run Code Online (Sandbox Code Playgroud)