Emacs中yasnippet导致python-mode缩进错误

1 投票
1 回答
1112 浏览
提问于 2025-04-17 21:33

即使我打开一个纯净的 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 个回答

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 键像下面这样缩进代码,否则可能会关闭 forif

for ..:
    if ..:
        ...
        break
else:
    ...

在你输入 else 之前,你需要按一下退格键来重新缩进,这样它才能正确关闭 for(默认情况下,它会缩进到关闭 if 的位置)。

撰写回答