2012-04-03 15 views
6

Normalmente escribo código con pestañas, pero muchas bibliotecas de python usan espacios. ¿Hay alguna forma de que Notepad ++ detecte automáticamente cómo se formatea el archivo y que cambie automáticamente a espacios cuando el archivo ya está formateado de esa manera?Notepad ++ Detección automática de pestañas o espacios de Python

Por cierto, sé que ya existe un SO question sobre cómo cambiar el formato de la pestaña de Notepad ++. Pero sería mejor si cambiara automáticamente en función del formato del archivo actual.

+0

nota al margen: Herramientas de Python para Visual Studio normalizará automáticamente el espaciamiento a ser o tabuladores o espacios –

+1

no, pero Vim puede :-) –

Respuesta

6

Si instala el complemento "Python Script" para Notepad ++, puede escribir código para cambiar automáticamente entre pestañas y espacios.

Así es como:

  1. En el menú: Complementos -> Script Python -> Configuración y establezca inicialización a ATSTARTUP. Cuando se inicia Notepad ++, se ejecutará el script startup.py.

  2. Encuentra startup.py y edítalo. En mi PC su ruta es c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py, agregue el siguiente código a startup.py.

La función buffer_active() se llama cada vez que cuando se cambia de ficha y guess_tab() comprueba si el texto está usando tabulación de sangría o no. Puede mostrar la consola de Python para depurar el código.

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

Esto es sólo un ejemplo, no dude en hacer guess_tab() mejor a ti mismo, tal vez usar un diccionario global para almacenar en caché el resultado y velocidad de la función de devolución de llamada.

+0

Parece que no funciona.Esto puede ser un problema con PythonScript. No veo nada impreso en la consola cuando cambio las pestañas. ¿No debería ver setUseTabs? – speedplane

+0

¡Acabo de probarlo, y funciona perfectamente! speedplane: cambie "if count> 5" a "if count> 0" ... ¿tal vez lo ha intentado en archivos con menos de 6 líneas con pestañas delante? @HYRY: ¿por qué no lo publicas aquí? https://sourceforge.net/projects/npppythonscript/forums/forum/1199074 ... ¡es un guión muy útil! – ufo

+0

¡Lo tengo trabajando! Tuve que volver a instalar el complemento de Python Script desde el administrador de complementos. – speedplane

1

¡No!

siempre puede cambiar ellos (a pestañas, por supuesto) para satisfacer sus necesidades con Reemplazar todo (    , \t) en el modo extendido.

+2

o ** te xtFX> TextFX Edit> Líder de espacios en pestañas o pestañas en espacios **, pero a veces cuestiono la eficacia de los complementos de Notepad ++. – BoltClock

+0

@BoltClock: Ah, gracias. Por lo general, me da miedo tocar el menú de TextFX :) – Ryan

2

Aquí es una versión mejorada en base a la respuesta de Hyry:

  • Obras en la pestaña de inicio (cuando se inicia Notepad ++ para abrir un archivo)
  • no necesita una cantidad mínima de filas para activar la sangría detección. La suposición de indentación se basa en la primera línea sangrada encontrada.
  • Mantiene los valores predeterminados de sangría cuando la sangría no se puede detectar
  • muy eficiente, no ralentiza Notepad ++ al abrir archivos grandes (probado en un archivo de 220 MB, la detección muesca tarda sólo < 300 ms)

Disponible para su descarga aquí: 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

Y aquí hay otro que también detecta el número de espacios (y es mucho más corto): https://gist.github.com/patstew/8dc8a4c0b816e2f33204e3e15cd5497e – patstew

Cuestiones relacionadas