Мне надоело после окончания поиска файлов, содержащих строки, открывать найденные файлы и повторять поиск (особенно, если поиск в файлах по регэкспу с помощь. плагинов, а поиск в файле настроен не через эти плагины. А также если имеется несколько строк, удовлетворяющих критерию поиска, и надо перейти на конкретную). В результате родился предлагаемый к обсуждению макрос.
Его отличия от поиска по CtrlF7:
Образец может быть регэкспом в формате LUA или Perl
В результатах показывается найденная строка (как GREP), а также 3 строки выше и ниже найденной
При переходе на выбранную строку редактор сразу позиционируется на неё.
Можно отметить несколько найденных строк (по одной в каждом файле), и тогда в редакторе будут открыты все отмеченные файлы (также с позиционированием на отмеченных строках)
Из результатов поиска можно удалять "мешающие" строки
Можно сворачивать - разворачивать строки, принадлежащие одному файлу
Окно поиска:
Процесс поиска:
Результат:
Обратите внимание: в результате строки файлов BaseLoad.pas b CHECK2TU.PAS "схлопнуты" (Condensed); несколько строк помечены. Внизу окна выведены 7 строк возле текущей (3 выше и 3 ниже)
Исправлена ошибка, в результате которой языковой файл находился только если язык либо ФАРа, либо помощи был Rus
В полной мере использована возможность указания в BreakKey Action; в результате ушла ошибка, в результате которой после удаления и предпросмотра файла пропадало "схлопывание" подразделов
Исправлен мелкий недочёт: можно было удалить строку-разделитель, а также вызвать редактор для этих строк
Добавлены хоткеи для разворачивания/сворачивания строк одного файла (Ctrl+Left, Ctrl+Right)
Добавлен хоткей для перехода к файлу в панели (Ctrl+G, Ctrl+Shift+G)
Добавлена возможность в настройках указать количество строк, выводимых в оне предпросмотра ДО и ПОСЛЕ найденной строки. Настройка вызывается или при помощи плагина Scripts Browser, либо из запроса на поиск, если выбрать "кодировку по расширению" и вызвать [ Настройка CP в зависимости от расширения ]
Версия 1.0.4
Исправлена ошибка (реакция на недокументированные кнопки)
Реализован переход на файл, если нажата CtrlG на разделителе
Название файлов в разделителе центрируется по окну, а не по самой длинной строке
В заголовок окна предпросмотра добавлено имя файла
Версия 1.0.5
Добавлена возможность поиска не только в папке на диске, но и на панели. Например, на временной панели. Если на панели - каталог, то поиск производится во вложенных каталогах.
При поиске на панели добавлена возможность ограничить поиск отмеченными файлами / папками.
Добавлена возможность поместить найденные файлы на временную панель, а при поиске на временной панели - наоборот, вычеркнуть файлы с временной панели.
Версия 1.0.6
Восстановлена возможность перетаскивания окна результатов поиска мышкой. Версия 1.0.7
Сделана возможность при узких экранах переносить элементы диалога на следующую строку
Сделана настройка на предпочтительную область поиска (диск/панель) (забыл отметить в новостях…)
Версия 1.0.8
Исправлена ошибка, проявлявшаяся при запуске макроса без настроек
Версия 1.0.9
Реализован поиск файлов не по маске, а по lua-выражению
Версия 1.0.10
Рефакторинг. Изменён полностью порядок просмотра файлов в разных кодировках. Для этого сначала весь файл читается в память. В результате сильно упрощена работа скрипта, алгоритм стал более понятным и прозрачным
Исправлена ошибка, проявлявшаяся в том, что при выборе кодировки «All» строки в предпросмотре дублировались.
При наличии у файла «Маркера последовательности байтов» (BOM), соответствующего кодировке UTF-8, он имеет наивысший приоритет перед остальными настройками
Версии 1.0.11, 1.0.12
Исправлена ошибка, появившаяся в версии 1.0.7 (пропала кнопка вызова настройки кодовой страницы в зависимости от расширения файла, а также количества строк предпросмотра). Изменения внесены только в языковой файл.
Добавлено расширение табуляций пробелами в строках предпросмотра. Функция взята из сообщения (отдельное спасибо John Doe)
Если активная панель видна, и она - файловая и не плагинновая, то в качестве "стартового" каталога теперь берётся не текущий системный каталог, а каталог, который отображён на панели.
При повторном вызове поиска в одной сессии (при неудаче поиска) стартовый каталог не изменяется.
Версия 1.0.13
Изменён вызов panel.GetPanelInfo в связи с изменившимися требованиями к параметрам
Версия 1.1.1
Нормализованы модули (сгруппированы по тематике). В результате изменены команды загрузки модулей
Добавлена возможность распахивать окно результатов на весь экран. Тулза повешена на кнопку F5
Версия 1.1.2
Добавлена возможность вызова настройки из меню Параметры плагинов (F9 -> Optons -> Plugins).
Добавлен вывод номеров строк (см. замечание от citRiks).
[/list] Версия 1.1.3
Восстановлена возможность использования в качестве маски файлов имени группы масок в виде #<<имя_маски>#. Работае только в том случае, если имя группы масок состоит только из букв, цифр и подчёрка.
Версия 1.1.4
В случае, если кодировка файла не соответствует той, что была указана в поисковом запросе (а в случае выбора кодировки All - той, в которой скрипт пытается читать файл) обработка файла в этой кодировке прекращается. Для варианта All происходит переход на следующую кодировку.
Версия 1.1.5
Изменён эвристический алгоритм автоматического распознавания кодировки. В некоторых случаях показывает значительно более устойчивый результат.
Добавлена возможность ограничить поиск образца первыми n строками
Версия 1.1.6
Исправлен английский языковой файл Find_n_GoEng.lng.
Версия 1.1.7
Добавлена настройка скрипта «Показывать результаты поиска в распахнутом окне».
Last edited by buniak_a_h on Wed 07 Feb, 2024 18:16, edited 31 times in total.
aflexus wrote: ↑Sun 14 Mar, 2021 13:22buniak_a_h, работает отлично, но вопрос в другом - есть ли теперь смысл в опциях выбора кодировки при поиске? Если раньше, при указании в какой кодировке искать, скрипт искал в ней (ну или так казалось по крайней мере), то теперь вне зависимости от установки (All, Auto, UTF-8, OEM, ANSI...) ищет во всех
Эти опции пока оставлены "на всякий случай". Планирую убать.
Я попробовал сделать одну строку из кириллицы в кодировке ANSI, а другую - в кодировке OEM. Ну и где-то между ними искомая строка, которая тоже в кириллице. Прога должна была запутаться и применить "старую" логику. Пока не получилось запутать. Получилось только если строки в разных кодировках "слепить" в одну. И ещё включался старый механизм при попытке поиска в вообще не-текстовом файле (*.7z). На такой случай я оставил отладочный вывод (OutputDebugString); если у Вас есть Debug Viewer, то было бы интересно узнать, включается ли "старый механизм).
На самом деле там не совсем "все" кодировки проверяются, а нечто типа адаптивной логики: если хоть на одной строке однозначно установлена кодировка, то остальные строки рассматриваются только в этой кодировке. "Однозначно" - это значит, что (а) не UTF-8; (б) при интерпретации как OEM в результирующей строке появляются "кракозябры", которых нет при интерпретации как в ANSI и наоборот.
Именно поэтому в файле, состоящем из строк в обеих кодировках результат может зависеть от порядка строк. Но я пока не понимаю, почему у меня всё равно ищет. Просто разбираться неохота ( «работает - вот и не трожь» )
Я думал, что, возможно, тормоза будут неприемлемые - тогда, если юзер точно знает кодировку, это может дать возможность ускорить. Пока, правда, особого замедления не заметил. Так как-то…
aflexus wrote: ↑Mon 15 Mar, 2021 12:17buniak_a_h, Debug Viewer. Где его взять?
1. Быстренько погуглил и нашёл: DebugView - теперь им не пользуюсь, т.к. спрашивает повышенные права.
2. Ещё погуглил DebugViewe++ (тот, чем я сейчас пользуюсь) и получил: DebugView++
Если будете использовать для отладки моих скриптов, то я всегда ставлю "метку" BAX: <номер строки>. Удобно после установки фильтра. Иначе сыпется очень много мусора (в т.ч. от системных утилит).
buniak_a_h, Странно, но с обоими утилитами у меня ничего в логах не появляется - ни от макроса, ни от других программ. Видимо, я что-то не так делаю. Запускал и под админом, и под обычным пользователем.
aflexus, ну, проверить легко: пишете в комстроке lua:win.OutputDebugString('BAX.1:'). Если DebugViewer-ы показывают строку BAX.1:, значит, Вы всё сделали правильно.
С LUA я еще разбирался, попробую. Глядя на окно диалога поиска, для меня нет одного параметра: включить/исключить из поиска список папок/файлов.
Имеется поле исходной папки для поиска. Если надо, могу доделать, чтоб там был список папок через ;. Также могу доделать список исключаемых папок (через |)
Список файлов - есть (маска, аналогичная маске файлов в поиске по Alt+F7).
buniak_a_h wrote: ↑Fri 02 Feb, 2024 16:08
могу доделать
Я попробую в данном варианте, а там посмотрим. К сожалению график работы не располагает большим количеством свободного времени, поэтому процесс тестирования может затянуться.
Добавлю для понимания поиска для меня: я ищу на сетевых ресурсах (а там может быть много чего) файлы с определенным содержимом, поэтому важна скорость обработки файлов (за это отвечает алгоритм), а также исключения папок/файлов, что сокращает время поиска.
Last edited by ustas.murom on Sat 03 Feb, 2024 06:24, edited 1 time in total.
ustas.murom wrote: ↑Sat 03 Feb, 2024 06:13
Добавлю для понимания поиска для меня
Видимо, Вам будет актуально 2 дополнения:
Флаг типа "искать только одно (2,3) совпадения. Сейчас ищутся все, а для этого читается весь файл. Если искать до первого попадания, то в случае нахождения процесс может резко ускориться. Можно также искать вообще до первого найденного файла.
Ограничить чтение файлов первыми 10-ю (100, 1000-ю) строками. Эффективно ускорит, если знаете, что искомый фрагмент расположен в начале файла.
buniak_a_h wrote: ↑Tue 06 Feb, 2024 04:05
Выложена новая версия скрипта (1.1.5). Основное отличие - введена возможность ограничить поиск паттерна первыми n строками
╔═══════════════════════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════════════════════╗
║ ...x64\Profile\Macros\scripts\Panel.Find_n_Go\Find_n_Go.lua:284: attempt to index a nil value ║
║ stack traceback: ║
║ ...x64\Profile\Macros\scripts\Panel.Find_n_Go\Find_n_Go.lua: in function 'Dialog_Exec' ║
║ ...x64\Profile\Macros\scripts\Panel.Find_n_Go\Find_n_Go.lua:1205: in function <...x64\Profile\Macros\scripts\Panel.Find_n_Go\Find_n_Go.lua: ║
║ 1204> ║
╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ { OK } ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
dmitrik, у меня один раз тоже такое случилось. Увы, больше не повторялось. Если Вы не против, я бы с Вами поработал (послал бы скрипт с отладкой в личку).
Last edited by buniak_a_h on Wed 07 Feb, 2024 08:45, edited 1 time in total.
╔═══════════════════════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════════════════════╗
║ ...Find_n_Go.lua:284: attempt to index a nil value ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
В рассылку попал неполный английский языковой файл - не хватает двух строк. Перевыложу.
buniak_a_h wrote: ↑Wed 07 Feb, 2024 00:52dmitrik, у меня один раз тоже такое случилось. Увы, больше не повторялось. Если Вы не против, я бы с Вами поработал (послал бы скрипт с отладкой в личку).
Я не против, но, насколько я понимаю, уже неактуально.
А у меня другой вопрос. Можно как-то в настройках скрипта указать, чтобы панель с результатами поиска сразу открывалась развернутой? Т.е., чтобы не нужно было F5 нажимать?