Notepad ++ File Filters - PullRequest
       16

Notepad ++ File Filters

6 голосов
/ 03 февраля 2010

Мне было интересно, можно ли перечислить исключение в фильтрах файлов в функции «найти в файлах» Notepad ++.

Например, следующее заменит Собака на Кошку во всех файлах.

Найти что: собака

Заменить на: Cat

Фильтры: *. *

Я хотел бы заменить Dog на Cat во всех файлах, кроме тех, которые находятся в .sh файлах.

Возможно ли это?

Ответы [ 2 ]

9 голосов
/ 03 февраля 2010

Я думаю, что что-то вроде "отрицательного селектора" не существует в Notepad ++.

Я быстро взглянул на исходный код 5.6.6 и похоже, что механизм выбора файлов сводится к функции с именем getMatchedFilenames(), которая рекурсивно запускает все файлы в определенной директории которая в свою очередь вызывает следующую функцию, чтобы увидеть, соответствует ли имя файла шаблону:

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

Насколько я могу определить, PathMatchSpec не разрешает отрицательные селекторы.

Однако можно ввести список положительных фильтров . Если бы вы могли составить этот список достаточно долго, чтобы включить все расширения в вашем каталоге, кроме .sh, вы тоже там.

Удачи!

3 голосов
/ 03 февраля 2010

Отличный ответ от littlegreen.
К сожалению, Notepad ++ не может этого сделать.

Этот проверенный пример поможет (Python). replace метод благодаря Томасу Ватнедалу :

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()
...