【问题标题】:inverted reindent.py (spaces to tabs)反转 reindent.py(空格到制表符)
【发布时间】: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-class com; 灰色)是完全错误的。
  • 你从语法更高检查问题标签的想法开始......这是不正确的。 :)
  • afaik 确实如此。我想它也会检查shebangs。和特殊的提示行,如<!-- language: lang-xml -->
  • 我刚刚检查过。确实如此。请参阅this question by me 并尝试重新创建它。它将在所有三个代码框上使用一个突出显示方案,我用上面的提示行避免了。

标签: python indentation


【解决方案1】:

在 unix 中使用 sed 可以通过一行得到它:

sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file

编辑:这仅适用于行首的空格。

【讨论】:

  • 不,请再读一遍。我自己很享受sed -r 的力量,但在这种情况下,正则表达式是不够的。
  • @Flying:您是不想使用sed还是无法满足您的要求?
  • 您的编辑似乎(我没有尝试)几乎完成了我想要的,但它也会错误地替换文档字符串中的缩进。这就是问题所在,您需要解析文件才能正确执行(除了我的脚本),并且只有 reindent.py 正确。但它使用 4 个空格而不是制表符。我想我得重写它。 叹息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2016-08-17
  • 2010-10-02
  • 2014-04-27
相关资源
最近更新 更多