2012-04-03 19 views
6

Tôi thường viết mã bằng các tab nhưng nhiều thư viện python sử dụng dấu cách. Có cách nào để Notepad ++ tự động phát hiện tệp được định dạng và tự động chuyển sang sử dụng khoảng trắng khi tệp đã được định dạng theo cách đó không?Notepad ++ Tự động phát hiện các tab hoặc không gian của Python

BTW, tôi biết đã có SO question về cách thay đổi định dạng tab của Notepad ++. Nhưng sẽ tốt hơn nếu nó tự động thay đổi dựa trên định dạng của tệp hiện tại.

+0

Side lưu ý: Công cụ Python cho Visual Studio sẽ tự động bình thường khoảng cách trở thành một trong hai phím space hoặc tab –

+1

Không, nhưng vim thể :-) –

Trả lời

6

Nếu bạn cài đặt plugin "Python Script" cho Notepad ++, bạn có thể viết mã để tự động chuyển giữa các tab và dấu cách.

Đây là cách:

  1. Trong menu: Plugins -> Python Script -> Configuration, và thiết lập khởi để ATSTARTUP. Khi Notepad ++ bắt đầu, tập lệnh startup.py sẽ chạy.

  2. Tìm startup.py và chỉnh sửa. Trên PC, đường dẫn của nó là c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py, thêm mã sau vào startup.py.

Chức năng buffer_active() được gọi mỗi khi bạn chuyển tab, và guess_tab() kiểm tra xem văn bản được sử dụng tab thụt lề hay không. Bạn có thể hiển thị bảng điều khiển Python để gỡ lỗi mã.

def guess_tab(text): 
    count = 0 
    for line in text.split("\n"): 
     indents = line[:len(line)-len(line.lstrip())] 
     if "\t" in indents: 
      count += 1 
    if count > 5: 
     return True 
    else: 
     return False 

def buffer_active(arg): 
    editor.setBackSpaceUnIndents(True) 
    use_tab = guess_tab(editor.getText()) 
    editor.setUseTabs(use_tab) 
    sys.stderr.write("setUseTabs %s\n" % use_tab) 

notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED])  
notepad.callback(buffer_active, [NOTIFICATION.BUFFERACTIVATED]) 

Đây chỉ là một ví dụ, cảm thấy tự do để làm guess_tab() bản thân tốt hơn, có thể sử dụng một dict toàn cầu để cache kết quả và tăng tốc các hàm callback.

+0

Có vẻ như không hoạt động.Điều này có thể là một vấn đề với PythonScript. Tôi không thấy bất cứ thứ gì được in trên bảng điều khiển khi tôi chuyển đổi các tab. Tôi không nên thấy setUseTabs? – speedplane

+0

Tôi vừa thử nó, và nó hoạt động hoàn hảo! speedplane: thay đổi "nếu count> 5" thành "if count> 0" .. có thể bạn đã thử trên các tệp có ít hơn 6 dòng với các tab ở phía trước nó? @HYRY: tại sao bạn không đăng nó lên đây? https://sourceforge.net/projects/npppythonscript/forums/forum/1199074 ... đó là một kịch bản rất tiện dụng! – ufo

+0

OK! Tôi đã phải cài đặt lại plugin Python Script từ trình quản lý plugin. – speedplane

1

Không!

Bạn luôn có thể thay đổi chúng (thành tab, tất nhiên) để phù hợp với nhu cầu của bạn bằng Thay thế tất cả (    , \t) ở chế độ mở rộng.

+2

hoặc ** Te xtFX> TextFX Edit> Dẫn các khoảng trống đến các tab hoặc các tab đến các khoảng trắng **, nhưng đôi khi tôi hỏi về hiệu quả của các plugin Notepad ++. – BoltClock

+0

@BoltClock: Ah, cảm ơn. Tôi thường ngại chạm vào menu TextFX :) – Ryan

2

Dưới đây là một phiên bản cải tiến dựa trên HYRY của câu trả lời:

  • Hoạt động trên tab khởi động (khi bạn khởi động notepad ++ để mở một tập tin)
  • Không cần một số tiền tối thiểu hàng để kích hoạt thụt đầu dòng phát hiện. Thụt lề được dựa trên dòng thụt đầu tiên gặp phải.
  • Giữ mặc định thụt đầu dòng khi thụt đầu dòng không thể phát hiện
  • Rất hiệu quả, không làm chậm Notepad ++ khi mở các file lớn (thử nghiệm trên một tập tin 220 MB, phát hiện thụt đầu dòng chỉ mất < 300 ms)

sẵn để tải về ở đây: https://gist.github.com/vincepare/8a204172d959defb2122

import re 
import time 

def indent_guess_tab(text): 
    for line in text.split("\n"): 
     pattern = re.compile("^({4,}|\t)") 
     match = pattern.match(line) 
     if (match): 
      return True if ("\t" in match.group(1)) else False 

def indent_auto_detect(arg): 
    start = time.clock() 

    # Get text sample 
    maxLen = 500000 
    len = editor.getTextLength() 
    len = len if len < maxLen else maxLen 
    sample = editor.getTextRange(0, len) 

    # Indent set 
    current_use_tab = editor.getUseTabs() 
    use_tab = indent_guess_tab(sample) 

    if (use_tab != None and use_tab != current_use_tab): 
     console.write("Indent use tab switch (%s => %s)\n" % (current_use_tab, use_tab)) 
     editor.setUseTabs(use_tab) 

    end = time.clock() 
    console.write("Indentation detection took %s ms\n" % (round((end-start)*1000, 3))) 

notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED, NOTIFICATION.READY])  
notepad.callback(indent_auto_detect, [NOTIFICATION.BUFFERACTIVATED]) 
notepad.callback(indent_auto_detect, [NOTIFICATION.READY]) 
console.write("Automatic indentation detection started\n") 
indent_auto_detect(None) 
+0

Và đây là một số khác cũng phát hiện số lượng dấu cách (và ngắn hơn nhiều): https://gist.github.com/patstew/8dc8a4c0b816e2f33204e3e15cd5497e – patstew

Các vấn đề liên quan