在emacs 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)
))
一般来说,它的缩进还不错,比如说我写:
if condition:
然后按下回车键,它会把光标放在正确的缩进位置。问题是,它在缩进的地方不能正确地“退出”缩进。在其他系统中,当我在缩进的代码块(比如 if
语句的内容)里换行并按下退格键时,它会把缩进级别减少一级,而不是简单地删除字符。例如,如果我写了:
if condition:
statement1
statement2
然后我按下回车和退格键,在 statement2
后面,它的光标会移动到这里:
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" 启动 emacs 时无法让这个功能正常工作(我是在远程登录到一个服务器,不想启动 X 界面)。当我去掉 "-nw" 并使用 emacs,虽然远程的 X 界面比较慢,但一切都正常……你知道这可能是什么原因吗?这可能是和退格键有关的 shell 配置问题吗?
这个问题怎么解决呢?我只想在缩进层级里按退格键时能够正常工作。谢谢。
5 个回答
这是一个错误。
最近,py-smart-indentation 错误地将一个值猜成了 4。
为了快速解决这个问题,请在以下链接报告 python-mode.el 的错误:
我猜测 python-mode.el 这个工具不支持不同的缩进宽度。你最后的例子用了 2 个和 3 个空格来缩进。为什么不总是使用 4 个空格来缩进呢?使用 4 个空格是 标准风格。
补充说明:当我打开一个新文件并复制你的最后一个例子时,我确实能重现你说的问题。不过,当我关闭文件再重新打开时,我可以正确退出缩进。我也可以通过选择代码然后按 C-c :
(py-guess-indent-offset)来做到这一点,而不需要关闭再打开。
对于现代版本的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