2010-02-02 15 views
6

Me preguntaba si era posible enumerar una exclusión dentro de los filtros de archivos en la funcionalidad "encontrar en los archivos" de Notepad ++.Notepad ++ File Filters

Por ejemplo, lo siguiente reemplazará a Perro con gato en todos los archivos.

encontró lo que: Perro

Sustituir por: Gato

Filtros: * *

Lo que me gustaría hacer es reemplazar el perro con el gato en todos los archivos excepto aquellos en los archivos .sh..

¿Esto es posible?

Respuesta

9

Creo que algo como un "selector negativo" no existe en Notepad ++.

me dio un rápido vistazo a la 5.6.6 source code y parece que el mecanismo de selección de archivos se reduce a una función llamada getMatchedFilenames() que se extiende de forma recursiva a través de todos los archivos debajo de un determinado directorio, que a su vez llama a la función siguiente para ver si el nombre del archivo coincide con el patrón:

bool Notepad_plus::matchInList(const TCHAR *fileName, const vector<generic_string> & patterns) 
{ 
    for (size_t i = 0 ; i < patterns.size() ; i++) 
    { 
     if (PathMatchSpec(fileName, patterns[i].c_str())) 
      return true; 
    } 
    return false; 
} 

Por lo que yo puedo determinar, PathMatchSpec no permite selectores negativos.

Sin embargo, es posible ingresar a list of positive filters. Si puede hacer que la lista sea lo suficientemente larga como para incluir todas las extensiones en su directorio, excepto .sh, también estará allí.

¡Buena suerte!

+1

Usar la PathMatchSpec para excluir un perfil de compatibilidad de archivos si el patrón comienza con "-" un signo menos, por ejemplo. Eso necesitará decir dos variables bool: emparejado y excluido. El método no tendrá retorno desde dentro del ciclo. La devolución final será! Excluidos && emparejado – Rbjz

3

Great answer por littlegreen.
Desafortunado que Notepad ++ no puede hacerlo.

Este ejemplo probado hará el truco (Python). replace método gracias a Thomas Watnedal:

from tempfile import mkstemp 
import glob 
import os 
import shutil 

def replace(file, pattern, subst): 
    """ from Thomas Watnedal's answer to SO question 39086 
     search-and-replace-a-line-in-a-file-in-python 
    """ 
    fh, abs_path = mkstemp() # create temp file 
    new_file = open(abs_path,'w') 
    old_file = open(file) 
    for line in old_file: 
     new_file.write(line.replace(pattern, subst)) 
    new_file.close() # close temp file 
    os.close(fh) 
    old_file.close() 
    os.remove(file) # remove original file 
    shutil.move(abs_path, file) # move new file 

def main(): 
    DIR = '/path/to/my/dir' 

    path = os.path.join(DIR, "*") 
    files = glob.glob(path) 

    for f in files: 
     if not f.endswith('.sh'): 
      replace(f, 'dog', "cat") 

if __name__ == '__main__': 
    main() 
+0

Muy bien. Y luego puede agregar la secuencia de comandos a la lista de ejecutables en el complemento Nppexec. Los codificadores reales no necesitan GUI's :-) – thomaspaulb