2011-05-17 33 views
0

afaik reindent.py(在標準python示例中提供)有一個標記器,允許它根據縮進級別進行智能縮進,而不是根據每個級別提供的空間數量進行智能縮進(可以改變在錯誤的代碼)reverse reindent.py(空格到製表符)

不幸的是它強制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。有沒有non-zealot版本的reindent.py?

PS:爲什麼暗示突出// 4是一個評論,而不是一個截斷分裂?


下面的腳本應該做的伎倆,但無論我錯過了某事,或記號化是越野車(或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')) 
+0

關於PS:你知道'//'是很多語言的評論標記......不要太狂熱...... :) – neurino 2011-05-17 14:12:14

+0

我知道我有時候很喜歡狂熱,但是這段代碼是突出顯示爲python,其中'//'表示「截斷分割」的語言。突出顯示該操作符後的所有內容(css-class'com'; gray)顯然是錯誤的。 – 2011-05-17 14:20:11

+0

你從語法higligher檢查問題標籤的想法開始......這是不正確的。 :) – neurino 2011-05-17 14:21:59

回答

3

在UNIX上使用sed你能得到它用一行代碼:

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

編輯:這隻適用於行開頭的空格。

+0

不適用,請再閱讀。我自己喜歡'sed -r'的力量,但在這種情況下,正則表達式是不夠的。 – 2011-05-17 14:25:40

+1

@Flying:你不想使用'sed'或使用它不會完成你的請求嗎? – neurino 2011-05-17 14:30:22

+0

你的編輯似乎(我沒有嘗試)做幾乎我想要的,但它也將錯誤地替換文檔字符串中的縮進。這就是問題所在,你需要解析文件才能正確地執行它(除了我的腳本),並且只有reindent.py才能做到這一點。但它使用4個空格而不是製表符。我猜我必須重寫它。 *嘆息* – 2011-05-17 14:54:06