Мне надоело после окончания поиска файлов, содержащих строки, открывать найденные файлы и повторять поиск (особенно, если поиск в файлах по регэкспу с помощь. плагинов, а поиск в файле настроен не через эти плагины. А также если имеется несколько строк, удовлетворяющих критерию поиска, и надо перейти на конкретную). В результате родился предлагаемый к обсуждению макрос.
Его отличия от поиска по 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
Добавлена настройка скрипта «Показывать результаты поиска в распахнутом окне».
Find & Go - Поиск с предпросмотром и переходом
Posted: Sat 09 May, 2020 10:33
by buniak_a_h
Latest post of the previous page:
citRiks wrote: ↑Sat 09 May, 2020 10:17
в связи последними проблем со строками,
Я в теме, посвящённой этой проблеме, опубликовал простой и надёжный выход. Бороться с Shmuel-ем и zg больше не буду. За оптимизацию отдельное спасибо jd.
В _macroinit.lua вставил такой блок:
for _,v in ipairs({'len','match','find','gmatch','gsub','lower','upper'}) do
local savedName = 'Utf8_'..v
if not utf8[savedName] then
utf8[savedName] = utf8[v]
utf8[v] = function(s,...)
return (utf8.utf8valid(s) and utf8[savedName] or string[v])(s,...)
end
end
end
Т.к. там всё правильно, то мы имеем дело с одним из следствий закона Мерфи: блок, предназначенный для защиты всей системы от повреждения, выходит из строя первым и выводит из строя всю систему.
Find & Go - Поиск с предпросмотром и переходом
Posted: Sat 09 May, 2020 10:59
by buniak_a_h
P/S.
Тем более, что я не уверен, что замена utf8.len на string.len возможна и корректна везде. Я даже больше скажу! В данном случае (я имею в виду far_Menu.lua) нужна именно длина строки в символах (для определения ширины окна). Ну а если это не строка utf8, то как компромисс можно посчитать и в байтах. Будет слишком широко, но что ж делать…
Find & Go - Поиск с предпросмотром и переходом
Posted: Sat 09 May, 2020 11:23
by John Doe
Некорректную строку можно 'исправить'.
Find & Go - Поиск с предпросмотром и переходом
Posted: Sat 09 May, 2020 12:46
by buniak_a_h
John Doe wrote: ↑Sat 09 May, 2020 11:23
Некорректную строку можно 'исправить'.
Видимо, не в этой теме. Вас то не забанят, а мне оно надо?
Find & Go - Поиск с предпросмотром и переходом
Posted: Sat 09 May, 2020 14:01
by John Doe
buniak_a_h wrote: ↑Sat 09 May, 2020 12:46
а мне оно надо?
У меня есть идея, реализуется вроде не очень сложно
Сделать поиск по файлам depth-first
Еще наверное надо бы чтобы пустая строка в маске файла трактовалась как "любой файл", или звездочка
Сейчас при этом пустом поле просто ничего не находится, что может смущать умы
Find & Go - Поиск с предпросмотром и переходом
Posted: Mon 20 Jul, 2020 21:46
by buniak_a_h
citRiks, я уже старенький, вашего молодёжного сленга не понимаю…
Что такое поиск по файлам depth-first? Ограничит глубину поиска при поиске по подкаталогам? Немного усложнит диалог задания поиска.
С пустой строкой - согласен.
Find & Go - Поиск с предпросмотром и переходом
Posted: Mon 20 Jul, 2020 22:01
by citRiks
buniak_a_h,
(ой, я имел в виду наоборт bredth first)
ну вопчем звиняюсь за сленг, а значит это вот что
Поиск в иерархиях (или деревьях, или графах) можно разделить на два типа:
1.) Depth first - Рекурсивно заходим в каждый попавшийся каталог (ветку) пока не исчерпали всю его глибину,
когдаисчерпали - только переходим к следующему.
2.) Breadth first - заходим во все каталоги первого уровня по очереди, не углублясь
Когда обшарили первый уровень - только тогда переходим ко второму по глубине и так далее, до исчерпания
Breadth first имеет больше смысла при поиске файлов, так нам обычно нужнее то что зарыто неглубоко, в первых уровнях.
Тем более что, может попасться первой глубокая папка с кучами мусорных файлов
Но, Depth First бесхитростнее, технически проще реализуется, так как не надо составлять список папок по уровням, а просто заходить рекурсивно во все что попадается.
Поэтому у нас везде есть Depth First, что не очень правильно
Find & Go - Поиск с предпросмотром и переходом
Posted: Mon 20 Jul, 2020 22:05
by citRiks
PS
buniak_a_h wrote: ↑Mon 20 Jul, 2020 21:46
Ограничит глубину поиска при поиске по подкаталогам? Немного усложнит диалог задания поиска.
в обоих случаях поиск не должен быть ограничен по глубине,
поэтому в UI не обязатательно привносить задаваемую глубину, хотя наверное и имеет смысл в целом.
С другой стороны, да, в стандартном поиске можно задать ограничение на глубину захода,
и это действительно является некоторым примитивнейшим и неудобным способом делать "breadth first"
Find & Go - Поиск с предпросмотром и переходом
Posted: Mon 20 Jul, 2020 22:23
by buniak_a_h
citRiks, правильно ли я понял, что претензия - к порядку найденных файлов?
Ещё. Я для поиска использую (как ни странно ) far.RecursiveSearch. Я точно не смотрел, как сейчас, но раньше, по-моему, порядок сортировки не гарантировался. А это - ЖАЛЬ!
Find & Go - Поиск с предпросмотром и переходом
Posted: Mon 20 Jul, 2020 22:28
by HaRT
buniak_a_h wrote: ↑Mon 20 Jul, 2020 21:46
я уже старенький, вашего молодёжного сленга не понимаю
«Поиск в глубину» (depth-first search, DFS) и «поиск в ширину» (breadth-first search, BFS) — это одни из очень давно сформулированных алгоритмов. Думаю, они постарше вас будут. Дело не в сленге, а во владении терминологией.
Find & Go - Поиск с предпросмотром и переходом
Posted: Tue 21 Jul, 2020 19:39
by citRiks
buniak_a_h wrote: ↑Mon 20 Jul, 2020 22:23
citRiks, правильно ли я понял, что претензия - к порядку найденных файлов?
неправильно
Смысл предложения - избавится от длинных ненужных поисков по закоулкам одной ветки,
когда искомое лежит в другой соседней ветке, уровнем ниже точки начала поиска.
Но при этом да, первыми появятся результаты первых уровней вложения,
что и является преимуществом.
Опять же, чще всего искать в закоулках "depth first" это потеря времени чаще всего,
а когда первыми появляются резултаты из первых уровней релевантность их скорее всего выше,
и найдя искомое тогда можно уже остановить поиск в закоулочных уровней.
far.RecursiveSearch. Я точно не смотрел, как сейчас, но раньше, по-моему, порядок сортировки не гарантировался. А это - ЖАЛЬ!
RecursiveSearch это же не UI, это чисто внутренняя кухня поиска.
Можно сортировать результаты, в промежуточной таблице как-нибудь, или уже при отображении.
RecursiveSearch хоть он и рекурсивный, можно же задать ему куда и в каком порядке ходить.
Да, в для breadth first это чуть сложнее реализовать, но других ваших подвигов не должно быть сложнее
Find & Go - Поиск с предпросмотром и переходом
Posted: Tue 21 Jul, 2020 20:46
by buniak_a_h
citRiks wrote: ↑Tue 21 Jul, 2020 19:39
Смысл предложения - избавится от длинных ненужных поисков по закоулкам одной ветки
Либо надо лимитировать уровень, либо порядок обхода на поиск не влияет: просматриваться будут все файлы. Или вы имеете в виду что юзер прервёт поиск, когда увидит, что что-то найдено? Так я, вроде, в процессе поиска результат не визуализирую …
Find & Go - Поиск с предпросмотром и переходом
Posted: Wed 22 Jul, 2020 06:12
by citRiks
buniak_a_h wrote: ↑Tue 21 Jul, 2020 20:46
Или вы имеете в виду что юзер прервёт поиск, когда увидит, что что-то найдено? Так я, вроде, в процессе поиска результат не визуализирую …