2010-02-02 20 views
6

Mi chiedevo se fosse possibile elencare un'esclusione all'interno dei filtri file nella funzionalità "trova nei file" di Notepad ++.Notepad ++ Filtri file

Ad esempio quanto segue sostituirà Cane con gatto in tutti i file.

individuare ad esempio: Cane

Sostituire con: Gatto

Filtri: * *

Quello che vorrei fare è sostituire Cane con gatto in tutti i file ad eccezione di quelli in file .sh..

È possibile?

risposta

9

Penso che qualcosa come un "selettore negativo" non esista in Notepad ++.

Ho preso un rapido sguardo alla 5.6.6 source code e sembra che il meccanismo di selezione dei file si riduce ad una funzione chiamata getMatchedFilenames() che corre ricorsivamente tutti i file in una directory specifica, che a sua volta chiama la seguente funzione per vedere se la il nome del file corrisponde al modello:

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; 
} 

Per quanto posso determinare, PathMatchSpec non consente selettori negativi.

È tuttavia possibile immettere a list of positive filters. Se si riuscisse a creare quell'elenco abbastanza a lungo da includere tutte le estensioni nella directory eccetto .sh, ci si trova anche lì.

Buona fortuna!

+1

Utilizzare la PathMatchSpec per escludere un modello di incontro file se il modello inizia con "-" un segno meno per esempio. Ciò richiederà due variabili bool: abbinate ed escluse. Il metodo non avrà un ritorno all'interno del ciclo. Il ritorno finale sarà! Escluso & abbinato allo – Rbjz

3

Great answer da littlegreen.
Sfortunato che Notepad ++ non possa farlo.

Questo esempio testato farà il trucco (Python). replace metodo grazie al 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

Modo figo. E poi puoi aggiungere lo script alla lista di eseguibili nel plugin Nppexec. I veri programmatori non hanno bisogno di GUI :-) – thomaspaulb