2012-04-03 9 views
6

Normalerweise schreibe ich Code mit Tabs, aber viele Python-Bibliotheken verwenden Leerzeichen. Gibt es eine Möglichkeit für Notepad ++, automatisch zu erkennen, wie die Datei formatiert ist, und automatisch auf Leerzeichen umzustellen, wenn die Datei bereits so formatiert ist?Notepad ++ Automatische Erkennung von Python-Tabs oder Leerzeichen

BTW, ich weiß, es gab bereits eine SO question, wie Sie das Tabulatorformat von Notepad ++ ändern. Aber es wäre besser, wenn es sich automatisch ändert, basierend auf der Formatierung der aktuellen Datei.

+0

Randbemerkung: Python tools for Visual Studio Abstand automatisch normalisieren entweder Tabulatoren oder Leerzeichen –

+1

Nein, aber vim kann :-) –

Antwort

6

Wenn Sie das Plugin "Python Script" für Notepad ++ installieren, können Sie Code schreiben, um automatisch zwischen Tabs und Leerzeichen zu wechseln.

Hier ist, wie:

  1. Im Menü: Plugins -> Python-Skript -> Konfiguration und Initialisierung gesetzt ATSTARTUP. Wenn Notepad ++ gestartet wird, wird das Skript startup.py ausgeführt.

  2. Finden startup.py und bearbeiten Sie es. Auf meinem PC ist der Pfad c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py, fügen Sie den folgenden Code zu startup.py hinzu.

Die Funktion buffer_active() wird jedes Mal aufgerufen, wenn Sie Tab wechseln und guess_tab() überprüft, ob der Text Registerkarte Einzug oder nicht verwendet wird. Sie können die Python-Konsole anzeigen, um den Code zu debuggen.

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

Dies ist nur ein Beispiel, fühlen Sie sich frei guess_tab() sich besser zu machen, vielleicht ein globales dict verwenden Sie das Ergebnis und Speedup die Callback-Funktion cachen. Hier

+0

Scheint nicht zu funktionieren.Dies kann ein Problem mit PythonScript sein. Ich sehe nichts in der Konsole gedruckt, wenn ich Tabs wechsle. Sollte ich SetUseTabs nicht sehen? – speedplane

+0

Ich habe es gerade ausprobiert, und es funktioniert perfekt! Speedplane: ändern Sie "Wenn Anzahl> 5" zu "Wenn Anzahl> 0" .. vielleicht haben Sie es auf Dateien mit weniger als 6 Zeilen mit Tabs vor es versucht? @HYRY: warum postest du es hier nicht? https://sourceforge.net/projects/npppythonscript/forums/forum/1199074 ... es ist ein sehr praktisches Skript! – ufo

+0

Es funktioniert! Ich musste das Python Script Plugin vom Plugin Manager neu installieren. – speedplane

1

Nein!

Sie können jederzeit ändern sie einfach (zu Tabs, natürlich) an Ihren Bedürfnissen anpassen mit All ersetzen (    , \t) im erweiterten Modus.

+2

oder ** Te zu sein xtFX> TextFX Bearbeiten> Leading Leerzeichen zu Tabs oder Tabs zu Leerzeichen **, aber ich stelle die Wirksamkeit von Notepad ++ Plugins manchmal in Frage. – BoltClock

+0

@BoltClock: Ah, danke. Ich habe normalerweise Angst, das TextFX-Menü zu berühren :) – Ryan

2

ist eine verbesserte Version basiert auf Hyry Antwort:

  • Arbeiten auf der Registerkarte Autostart (beim Starten von Notepad ++ eine Datei zu öffnen)
  • Hat nicht eine minimale Menge an Zeilen müssen Vertiefung auslösen Erkennung. Die Indentationsermittlung basiert auf der ersten eingerückten Zeile.
  • Hält defaults Einzug wenn Einbuchtung nicht
  • Sehr effizient erfasst werden, nicht Notepad nicht verlangsamt ++, wenn große Dateien zu öffnen (getestet auf einem 220 MB-Datei, Einzug Erkennung nur < 300 ms dauert)

verfügbar zum Download hier: 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

Und hier ist ein weiterer, der auch die Anzahl der Leerzeichen erkennt (und viel kürzer ist): https://gist.github.com/patstew/8dc8a4c0b816e2f33204e3e15cd5497e – patstew

Verwandte Themen