Синхронизация редактора с результатами поиска (Show All)
Posted: Sat 28 Dec, 2019 01:42
by buniak_a_h
У плагина LuaFAR Search имеется удобная фишка, почему-то не реализованная в стандартном поиске: при показе ВСЕХ найденных строк при переходе по найденным строкам редактор позиционируется на соответствующей строке. Сделал я небольшой макрос, делающий аналогичную вещь.
Макрос состоит из четырёх обработчиков событий (два для стандартного диалога поиска и два для поиска по плагину RESearch). Первый Event читает параметры поиска, второй поддерживает переход по найденным строкам. Общая функция преобразовывает строку в координаты и реализует позиционирование и раскраску найденного.
Версия 1.2.1:
1. Сделана более корректно подсветка найденного образца (в версии 1 тупо подсвечивалось 5 символов)
2. Добавлено оформление скрипта в соответствии с требованиями Scripts Browser-а Версия 1.2.2.
1. Сделан учёт флага Case Sensitive для поиска по регулярному выражению Версия 1.3.1.
Оптимизация:
Полностью переделано определение номера и содержимого текущей строки с использованием Object.CurPos и Menu.Value (спасибо Xerox - memberlist.php?mode=viewprofile&u=18909)
Поиск элементов диалога по текстовым меткам с использованием функции чтения из языкового файла заменён на константы. Надеюсь, некоторое время не сломается. Поиск оставлен в виде комментариев "на всякий случай".
Как следствие пункта (2) убрано требование к модулю BAX\GetMsg
Версия 1.4.1
Реализовано первоначальное позиционирование на ближайший найденный образец ПОСЛЕ текущей позиции в редакторе
Реализован аналогичный функционал для результатов поиска по плагину RESearch (Regular Expression search).
Версия 1.5.1
Для СТАНДАРТНОГО поиска сделана возможность фильтрации результатов поиска по попаданию в отмеченный блок. Увы, раскраска найденных образцов в списке теряется, как это побороть - пока не знаю.
С фильтрацией. Увы, в списке айденного пропадает раскраска .
(4.39 KiB) Downloaded 73 times
Синхронизация редактора с результатами поиска (Show All)
Posted: Mon 30 Dec, 2019 19:22
by buniak_a_h
Latest post of the previous page:
John Doe wrote: ↑Mon 30 Dec, 2019 13:54
Только вот сказано, что исправление экспериментальное, а значит есть вероятность, что обнаружатся негативные последствия, из-за которых придётся вернуть всё как было.
Это правильно … Обнаружились сложности (неудобство) в использовании DN_LISTCHANGE вместо DN_INPUT.
Конкретно: после прихода DN_LISTCHANGE в Param.Param2 - правильное значение (новый индекс), а в Object.CurPos - предыдущий. Ну и, соответственно, Menu.Value - старое значение. Хотя Event = DE_DLGPROCEND (т.е., по идее, хендлер вызывается ПОСЛЕ стандартной обработки). Я понимаю, что обходится заменой Menu.Value на Menu.GetValue.
Ещё сложность с первым вхождением. Как оказалось, при DN_INITDIALOG Menu.GetValue(1) возвращает пустую строку. Т.е. МЕНЮ, видимо, ещё не проинициализировано. Так что пока (пока либо сам не придумаю, либо сообщество не подскажет) воздержусь от использования DN_LISTCHANGE …
Синхронизация редактора с результатами поиска (Show All)
Posted: Mon 30 Dec, 2019 21:28
by John Doe
Вот как раз тут особых проблем нет — достаточно исподьзовать соответствующие функции из апи плагинов (что кстати рекомендуется в любом случае, а в обработчиках событий так особенно).
Отмеченные вами несоответствия вероятно тоже поправимы, но это другой вопрос.
Синхронизация редактора с результатами поиска (Show All)
Posted: Mon 30 Dec, 2019 23:15
by buniak_a_h
John Doe wrote: ↑Mon 30 Dec, 2019 21:28
использовать соответствующие функции из апи плагинов
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 00:56
by Xerox
buniak_a_h,
эмм, я сильно не вникал, и если я правильно понял вопрос - "как получить текст из евента" (?)
если номер который приносит ДН_ЛИСТЧАНЖ он правильный, то можно брать из элемента диалога так: GetDlgITem(ep.Param1)[6][ep.Param2].Text
где:
6 = где сидит таблица значений в элементе ЛИСТ
ep = параметры евента
ep.Param1 = номер элемента ЛИСТ
ep.Param2 = номер нового значения элемента ЛИСТ
отсюда собственно: https://api.farmanager.com/ru/dialogapi ... hange.html
там еще что прикольно можно отменить этот переход на новое значение,
возможно поэтому значения МЕНЮ в обьектах не спешит становиться новым.
И мы тогда как бонус получаем прежнее значение МЕНЮ/позицию для сравнивания если надо,
без сохранения в переменных заранее, т.е. обходясь меньшим количеством переменных
ну если нет каких-нибудь засад с этим
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 04:10
by buniak_a_h
Xerox wrote: ↑Tue 31 Dec, 2019 00:56
если номер который приносит ДН_ЛИСТЧАНЖ он правильный, то можно брать из элемента диалога так: GetDlgITem(ep.Param1)[6][ep.Param2].Text
1. Ну, собсно, именно так я и беру (ну, почти - я не знаю, что такое GetDlgITem, но получаю по hDlg:send(F.DM_GETDLGITEM, 1) ). Я ж писал, что обойти можно. Просто теряется кайф от DN_LISTCHANGE …
2. На самом деле для первоначального позиционирования на первый найденный образец позже текущей позиции редактора я сразу в DN_INITDIALOG запоминаю все строки (да ещё слегка преобразовываю для повышения эффективности дальнейшей обработки). Поэтому эта проблема отсохла сама собой.
--
Сейчас выложу версию 1.4.1 с поддержкой результатов поиска плагином RESearch. Ещё тут родилась мысль, что, например, если в редакторе есть отмеченный блок, то по Ctrl+H можно скрывать результаты вне блока; таким образом можно будет "реализовать поиск внутри отмеченной области" (на самом деле, конечно, не реализовать, а симулировать). Хотелось бы знать, может ли это кому-нить кроме меня показаться удобным. Я до сих пор пользуюсь LF Search-ем и RESearch-ем только по той причине, что у стандартного F7 нет поиска в выделенной области. Я писал, но никто не делает …
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 06:27
by buniak_a_h
Версия 1.5.1 - сделана фильтрация по вхождению в блок. Увы, после обновления списка теряется раскраска найденных образцов в списке найденных. Ели кто знает, как с этим бороться - поможите кто чем может! Нашёл, но уже не сегодня…
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 10:37
by Xerox
buniak_a_h wrote: ↑Tue 31 Dec, 2019 04:10
Хотелось бы знать, может ли это кому-нить кроме меня показаться удобным
я думаю что было бы удобно
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 10:44
by Xerox
buniak_a_h wrote: ↑Mon 30 Dec, 2019 13:53
Кстати! Пользуется кто-нить из читающих эту тему плагином RESearch? Там тоже есть Show All и нету синхронизации… Стоит доделывать и публиковать?
если не очень затратно, то стоит, я рассматриваю его и ЛФСеарч, до конца не определился, да и вопче, опятьже, если не оч. затратно, то давай, спасибо
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 10:49
by buniak_a_h
Xerox wrote: ↑Tue 31 Dec, 2019 10:44
если не оч. затратно, то давай, спасибо
Дык уже в первом сообщении ткмы. Версия 1.5.1 - и фильтрация, и RESearch
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 12:46
by DV
Может, это исключительно моё восприятие, но немного изменённое стандартное поведение мне нравится больше... Для иллюстрации, вот макрос для поиска всех вхождений, которым я пользуюсь сейчас:
Macro {
description="Editor: Find all occurrences";
area="Editor";
key="AltA";
flags="NoSendKeysToPlugins";
action = function()
local selectionState = band(Editor.State, 0x00000010)
if selectionState == 0 then
Keys("F7 AltO AltA")
else
Keys("F7 AltL AltA")
end
local ln = tostring(editor.GetInfo().CurLine)
Keys("CtrlAltF " .. ln:gsub(".", "%1 "):sub(1,-2) .. " CtrlAltF")
end;
}
Для меня огромное преимущество данного макроса в таком, казалось бы, маленьком нюансе, что при его вызове экран не дёргается. Потому что когда текущая строка вдруг прыгает вверх, это неожиданно, взгляд теряется и ищет, куда же делась строка...
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 12:57
by buniak_a_h
DV wrote: ↑Tue 31 Dec, 2019 12:46
огромное преимущество <…>, что при его вызове экран не дёргается.
Да я согласен. Неохота было проверять, находится ли уже найденная строка на экране. Ну и не перекрыта ли она таблицей. В этом случае, извините, дёргаться будет всё равно - не смещать же диалог, чтоб показать найденное! В частности поэтому я пока не публикую последний (мой) вариант, сохраняющий раскраску при фильтрации…
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 13:04
by HaRT
buniak_a_h wrote: ↑Tue 31 Dec, 2019 12:57
не смещать же диалог, чтоб показать найденное
Конкретно этим диалогом не пользовался, но в целом я как пользователь предпочитаю именно смещение диалога — при условии, что возможно одновременно показать и найденное (по возможности целиком), и диалог (без его уменьшения).
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 14:42
by Xerox
HaRT,
Если что, то мой скрипт позволяет сдвигать и изменять размер диалога,
на днях закину обновленную совсем-совсем безглючную версию
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 15:40
by HaRT
Xerox wrote: ↑Tue 31 Dec, 2019 14:42
мой скрипт позволяет сдвигать и изменять размер диалога
Да мне довольно и своих (простеньких), которые прижимают диалог влево/ вверх/ вправо/ вниз или центруют — в зависимости от нажатого кнопкосочетания.
Синхронизация редактора с результатами поиска (Show All)
Тут возникает неприятный момент. Представьте, что мышка вне диалога, шагаю с клавиатуры. В какой-то момент приходится этот диалог сместить, и указатель мышки оказывается над списком. Оба!!! Указатель в списке смещается так, чтобы соответствовать указателю мышки. Или это настраивается?
Синхронизация редактора с результатами поиска (Show All)
Posted: Tue 31 Dec, 2019 16:01
by HaRT
buniak_a_h wrote: ↑Tue 31 Dec, 2019 15:51
указатель мышки оказывается над списком. Оба!!! Указатель в списке смещается так, чтобы соответствовать указателю мышки. Или это настраивается?
Насколько я понимаю, «в вакууме» ничто никуда не смещается, но в реальных условиях достаточно небольшого дрожания стола, чтобы породить событие движения мыши и привести к выбору другого элемента. Меня это не только в Фаре раздражает и огорчает, но переходить на трэкбол или тачпад я пока не готов.