Emacs中yasnippet导致python-mode缩进错误
即使我打开一个纯净的 emacs -Q
并在里面打开一个 Python 文件:
|
- 光标
if smth:
| print("asd") # press TAB and cursor moves to "p" symbol, it's ok
if smth:
|print("asd") # press TAB and I get this:
if smth:
print("asd") # press TAB and I get prev step
所以 TAB
键会循环改变缩进级别。这是我绝对不想要的。
如果使用 smart-tab
,这个问题可以解决。但是 yasnippet
的 (yas-global-mode 1)
又把它带回来了。
我就是找不到原因。
如果你遇到过这个问题(Python + yasnippet + 正确缩进) - 请给我一些建议。或者给我一个有效配置的链接。
最新的 Emacs 版本(24.3.50.1)
1 个回答
控制使用 TAB 键进行缩进循环的一种方法是自定义 python-indent-trigger-commands
这个变量。这个变量的说明文档提到:
可能会触发 `python-indent-line` 调用的命令。
不过,从说明文档中并不清楚这个变量是否可以用来控制缩进循环(其实我也不太确定设置这个变量是否是控制缩进循环的正确方法)。而 python-indent-line
的说明文档更好地解释了这个变量的用途:
当变量 `last-command` 的值等于
python-indent-trigger-commands
列表中的某个符号,或者 `FORCE-TOGGLE` 不是空值时,它会根据python-indent-levels
变量中指示的级别进行循环,并将当前级别设置在python-indent-current-level
变量中。
所以你可以用 (setq python-indent-trigger-commands nil)
(或者直接从列表中移除 indent-for-tab-command
)来禁用缩进循环。不过,这种方法有一个小缺点,就是你不能用 TAB 键像下面这样缩进代码,否则可能会关闭 for
或 if
。
for ..:
if ..:
...
break
else:
...
在你输入 else
之前,你需要按一下退格键来重新缩进,这样它才能正确关闭 for
(默认情况下,它会缩进到关闭 if
的位置)。