2012-04-03 12 views
6

Zazwyczaj piszę kod z kartami, ale w wielu bibliotekach Pythona używane są spacje. Czy istnieje sposób, aby Notepad ++ automatycznie wykrywał formatowanie pliku i automatycznie przełączał się na spacje, gdy plik jest już sformatowany w ten sposób?Notepad ++ Automatyczne wykrywanie tablic lub przestrzeni w języku Python

BTW, wiem, że było już SO question, jak zmienić format karty Notepad ++. Ale byłoby lepiej, gdyby automatycznie zmieniono w oparciu o formatowanie bieżącego pliku.

+0

marginesie: Python Tools for Visual Studio automatycznie znormalizowania odstępy być albo klapki lub przestrzenie –

+1

Nie, ale Vim może :-) –

Odpowiedz

6

Jeśli zainstalujesz wtyczkę "Python Script" dla Notepad ++, możesz napisać kod, aby automatycznie przełączać się między kartami i spacjami.

Oto jak:

  1. W menu: Plugins -> Python Script -> Konfiguracja i ustaw inicjalizacji ATSTARTUP. Po uruchomieniu Notepad ++ zostanie uruchomiony skrypt startup.py.

  2. Znajdź startup.py i edytuj. Na moim komputerze jego ścieżka to c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py, dodaj następujący kod do startup.py.

buffer_active() Funkcja jest wywoływana za każdym razem po włączeniu kartę i guess_tab() sprawdza, czy tekst jest przy użyciu wcięcie tabulatora czy nie. Możesz wyświetlić konsolę Python, aby debugować kod.

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]) 

Jest to tylko przykład, nie krępuj się, aby guess_tab() lepiej samemu, może korzystać z globalnej dict buforować wynik i przyspieszenia w funkcji zwrotnej.

+0

Wygląda na to, że nie działa.Może to być problem z PythonScript. Nie widzę niczego wydrukowanego na konsoli, kiedy przełączam karty. Nie powinienem zobaczyć setUseTabs? – speedplane

+0

Właśnie próbowałem i działa idealnie! Samolot: zmień "jeśli policzysz> 5" na "jeśli policzysz> 0" .. może wypróbowałeś go na plikach z mniej niż 6 liniami z zakładkami przed nim? @HYRY: dlaczego nie zamieścisz go tutaj? https://sourceforge.net/projects/nppppythonscript/forums/forum/1199074 ... to bardzo przydatny skrypt! – ufo

+0

Gotowy! Musiałem ponownie zainstalować wtyczkę Python Script z menedżera wtyczek. – speedplane

1

Nie!

zawsze można po prostu zmienić ich (do kartach, oczywiście) do własnych potrzeb z Zamień wszystko (    , \t) w trybie rozszerzonym.

+2

Or ** TE xtFX> Edycja TextFX> Prowadzenie spacji do zakładek lub kart do spacji **, ale czasami kwestionuję skuteczność wtyczek Notepad ++. – BoltClock

+0

@BoltClock: Ah, dzięki. Zazwyczaj boję się dotknąć menu TextFX :) – Ryan

2

Oto ulepszona wersja na podstawie HYRY za odpowiedź:

  • działa na karcie startowej (po uruchomieniu Notepad ++ do otwarcia pliku)
  • nie potrzebuje minimalnej ilości wierszy do wyzwalania wcięcia wykrycie. Domyslne domyslenie bazuje na pierwszej napotkanej linii z wcięciem.
  • Utrzymuje domyślne wcięcia kiedy wgniecenie nie może być wykryty
  • Bardzo wydajny, nie spowalnia Notepad ++ podczas otwierania dużych plików (testowane na pliku 220 MB, wykrywanie wcięcie zajmuje tylko < 300 ms)

Dostępny do pobrania tutaj: 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

A tu jest inny, który również wykrywa liczbę spacji (i jest znacznie krótszy): https://gist.github.com/patstew/8dc8a4c0b816e2f33204e3e15cd5497e – patstew

Powiązane problemy