【发布时间】:2011-05-17 14:01:42
【问题描述】:
afaik reindent.py(在标准 python 示例中可用)有一个标记器,允许它根据缩进级别而不是每个级别使用的空格数(在错误代码中可能会有所不同)进行智能重新缩进
不幸的是,它强制执行 4 个空格缩进,但我想要制表符,因为 1 个制表符 == 1 个缩进级别比 x 个空格更合乎逻辑。
this问题没有合适的答案:
- 我不关心 pep-8(我知道如何编写我的代码)
- vim 已安装,但
:retab!不处理不一致的缩进 - 所有工具也会将用于对齐的空格(!=缩进)转换为制表符。
一种方法是使用 reindent.py 然后做某事。喜欢:
#!/usr/bin/env python3
from re import compile
from sys import argv
spaces = compile("^ +")
multistr = False
for line in open(argv[1]):
num = 0
if not multistr:
try:
num = len(spaces.search(line).group(0)) // 4
except AttributeError:
pass
print("\t"*num + line[num*4:-1])
if line.count('"""') % 2 == 1:
multistr = not multistr
但那是相当hacky。没有非狂热版的 reindent.py 吗?
PS:为什么建议突出显示// 4 是注释而不是截断除法?
下面的脚本应该可以解决问题,但是我错过了某事,或者 tokenize 有问题(或 python 文档中的示例)
#!/usr/bin/env python3
from tokenize import *
from sys import argv
f = open(argv[1])
def readline():
return bytes(f.readline(), "utf-8")
tokens = []
ilvl=0
for token in tokenize(readline):
if token.type == INDENT:
ilvl+=1
tokens.append((INDENT, "\t"*ilvl))
else:
if token.type == DEDENT:
ilvl-=1
tokens.append(token)
print(untokenize(tokens).decode('utf-8'))
【问题讨论】:
-
关于 PS:你知道
//是很多语言的评论标记...不要太狂热... :) -
我知道我自己有时也很狂热,但是这段代码被突出显示为 python,这是一种语言,其中
//表示“截断除法”。将此运算符之后的所有内容突出显示为注释(css-classcom; 灰色)是完全错误的。 -
你从语法更高检查问题标签的想法开始......这是不正确的。 :)
-
afaik 确实如此。我想它也会检查shebangs。和特殊的提示行,如
<!-- language: lang-xml --> -
我刚刚检查过。确实如此。请参阅this question by me 并尝试重新创建它。它将在所有三个代码框上使用一个突出显示方案,我用上面的提示行避免了。
标签: python indentation