我知道这个问题已被问过很多次了,但我并没有找到解决我的问题的方法,主要是因为我甚至无法真正识别问题。
以下是事件的时间表:
- 打开旧的 python 文件(用 python2.7 编写)- 一切正常
- 更改键绑定以使用 python3 而不是 python2.7 执行 .py 文件 - 正如预期的那样,有很多
IndentError
s,但文件仍然是相同的结构/布局/空格/制表符的数量 - 添加
expandtab
到我的 .vimrc - 不再IndentError
有因不一致而产生的 s ,但IndentError
由于我的源代码结构现在完全混乱了,所以到处都是新的 s 。 - 我
expandtab
从我的 .vimrc 中删除它,但仍然得到相同的错误源,即使我杀死会话,退出 iTerm,从 github 提取最新的源...为什么!?
需要说明的是,在过去的几个月里,我的 vimrc 中只有两处被修改,而且都是今天早上做的。第一处是重新映射<F9>
以发出 python3 而不是 2.7 的 shell 命令,这不会影响我的源代码结构。第二处更改是添加,这expandtab
把一切都搞乱了……删除后expandtab
我的 vim 体验不会恢复到添加之前的状态。
我的源的结构改变是半统一的,所以让我尝试解释一下实际发生的情况。
以前是这样的:
class GUI():
def __init__(self):
suite of code
现在看起来像:
class GUI():
def __init__(self):
suite of code
并且对于所有嵌套的代码套件来说,情况似乎都是这样的......换句话说,第一次将制表符扩展为 4 个空格可以正常工作,但它并没有扩展嵌套在第一个制表符内的制表符,而是看起来像是删除了该制表符。
还发生了其他奇怪的事情,但我真的看不出有什么规律。
知道发生什么事了吗?
答案1
这种外观,随着每个其他缩进级别被删除,通常是(并且似乎是您的代码中的情况)查看代码的症状,该代码每个缩进有 4 个空格,但每隔一行有 8 个空格制表符(例如 4s、1t、1t4s、2t),设置tabstop
为 4。
对于 Python 代码,您只需将代码中的所有制表符替换为八个空格,因为这是解释器处理它的方式。通常,您可以使用:retab
命令后设置tabstop
为源代码最初编写的值,例如
:set ts=8
:retab 4
如果expandtab
设置了,retab 将用空格替换制表符。