Синхронизация редактора с результатами поиска (Show All)

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

У плагина LuaFAR Search имеется удобная фишка, почему-то не реализованная в стандартном поиске: при показе ВСЕХ найденных строк при переходе по найденным строкам редактор позиционируется на соответствующей строке. Сделал я небольшой макрос, делающий аналогичную вещь.
Макрос состоит из четырёх обработчиков событий (два для стандартного диалога поиска и два для поиска по плагину RESearch). Первый Event читает параметры поиска, второй поддерживает переход по найденным строкам. Общая функция преобразовывает строку в координаты и реализует позиционирование и раскраску найденного.




В скрипте используется мой модуль "Расширение GetMsg" Уже не используется.
EditorFindAllList.lua.1_4_1.7z
(3.86 KiB) Downloaded 69 times
Версия 1.5.1 - обещанная фильтрация по вхождению в блок (CtrlH)
EditorFindAllList.lua.1_5_1.7z
С фильтрацией. Увы, в списке айденного пропадает раскраска .
(4.39 KiB) Downloaded 73 times
Last edited by buniak_a_h on Tue 31 Dec, 2019 06:25, edited 4 times in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

Latest post of the previous page:

Xerox, к сожалению не нашёл, как определить номер пункта Menu. Value выдаёт только текст пункта. Казалось бы, для полноты функционала логично было бы предусмотреть выдачу не только текста, но и номера. Увы… А номер я использую чтоб определить, было ли смещение по списку.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Синхронизация редактора с результатами поиска (Show All)

Post by Xerox »

buniak_a_h wrote: Sat 28 Dec, 2019 20:24Menu.Value выдаёт только текст пункта
Да, это безобразие если так.
но можно еще посмотреть в Object.CurPos, там по-моему эта позиция и есть
Или как вариант детектить стрелка вниз-вверх, и сравнивать с предыдущим значением?
но по-моему Object.CurPos дает все что нужно
еще до кучи Menu.ItemStatus(<number-of-the-item>) возвращает 1/0/-1= current/not current/exceeded
Last edited by Xerox on Sat 28 Dec, 2019 20:39, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

Да, спасибо. Проверил - действительно. А я уж посылаю DM_LISTGETCURPOS
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

Xerox wrote: Sat 28 Dec, 2019 20:35 еще до кучи Menu.ItemStatus(<number-of-the-item>) возвращает 1/0/-1= current/not current/exceeded
В описании всё совсем не так … "Недоступен" - это 8 . Ну и вообще . Ну да ладно, это - лирика. Скрипт резко "полегчал". А если задать номера итемов вместо поиска (верить, что структура диалога инициации поиска не изменится), то вообще всё резко уменьшится. :-)
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Синхронизация редактора с результатами поиска (Show All)

Post by Xerox »

Кросота вопчем
А все-таки, зачем нужен именно номер пункта в меню?
вродь все равно только выбранное значение имеет смысл (?)
И я еще подумал, не упростит ли если можно воспользоваться искуственным посыланием КтрлЕнтер при переходах?
Как вариант прилепить макрос у которого Ареа=Меню, который реагирует на стрелки Кей="Уп Даун", и который посылает КтрлЕнтер?
Last edited by Xerox on Sun 29 Dec, 2019 10:30, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

Xerox wrote: Sun 29 Dec, 2019 10:29 А все-таки, зачем нужен именно номер пункта в меню?
Чтобы не вызывать всю эту тягомотину с синхронизацией-разотметкой-отметкой при каждом DN_INPUT. Она на самом деле приходит на каждое движение мыши или уж не знаю от чего ещё. Это довольно ресурсоёмкий процесс (match & tonumber).
Можно, конечно, запоминать саму строку и сравнивать с предыдущей, но это тоже может оказаться ресурсоёмко: не знаю, как в LUA, а в некоторых языках многократное запоминание строк приводит к расходованию памяти, что приводит к частому вызову сборщика мусора. Если б приходил DN_LISTCHANGE, то этого не потребовалось бы.
Xerox wrote: Sun 29 Dec, 2019 10:29 не упростит ли если можно воспользоваться искуственным посыланием КтрлЕнтер при переходах?
1. позицию всё равно надо знать (для раскраски), так что без match / tonumber не обойтись
2. а если позиция всё равно известна, то чем Keys"CtrlEnter" проще, чем editor.SetPosition(…)?
Впрочем, исходники открыты - всё в Ваших руках.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

Синхронизация редактора с результатами поиска (Show All)

Post by Xerox »

buniak_a_h wrote: Sun 29 Dec, 2019 13:45 Впрочем, исходники открыты - всё в Ваших руках.
Не, все и так прекрасно )
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Синхронизация редактора с результатами поиска (Show All)

Post by DV »

Пожелание к макросу: если искомое слово (вхождение) находится в текущей строке редактора, то при показе всех вхождений не прыгать на строку с первым найденным вхождением, а оставаться в текущей строке и сделать текущим соответствующий элемент в списке найденных вхождений.
Почему это важно. Лично я делаю поиск всех вхождений так: в окне поиска нажимаю кнопку [Word] или [Selection], чтобы подхватить текущее слово или выделенный текст, и нажимаю кнопку [All]. Когда при этом в списке найденных вхождений текущим элементом является не тот, который соответсвует текущей строке редактора (из которой я взял искомый текст), это сбивает с толку.
Last edited by DV on Mon 30 Dec, 2019 12:02, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by John Doe »

Code: Select all

zg 30.12.2019 04:29:53 +0200 - build 5542

1. экспериментально: DN_LISTCHANGE приходит в обычные меню.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

DV wrote: Mon 30 Dec, 2019 12:02 Пожелание к макросу: если искомое слово (вхождение) находится в текущей строке редактора, то при показе всех вхождений не прыгать на строку с первым найденным вхождением, а оставаться в текущей строке и сделать текущим соответствующий элемент в списке найденных вхождений.
Согласен. Хотя есть вопрос: если в ТЕКУЩЕЙ строке вхождения нет, надо ли позиционироваться на следующее за текущим положением вхождение? Думаю, да, но хотелось бы знать мнение.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Синхронизация редактора с результатами поиска (Show All)

Post by DV »

buniak_a_h wrote: Mon 30 Dec, 2019 12:50если в ТЕКУЩЕЙ строке вхождения нет, надо ли позиционироваться на следующее за текущим положением вхождение?
Можно сделать опцией :) Либо на ближайшее вхождение, либо на первое.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

John Doe, спасибо, круто! Поправлю (для версии >= 5542)
Жаль, что от нынешнего текста не избавиться, если делать совместимо для всех версий ФАРа :-(
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

Кстати! Пользуется кто-нить из читающих эту тему плагином RESearch? Там тоже есть Show All и нету синхронизации… Стоит доделывать и публиковать?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by John Doe »

buniak_a_h wrote: Mon 30 Dec, 2019 13:50 если делать совместимо для всех версий ФАРа :-(
Для совместимости оставить текущую версию.
А новую развивать независимо.

Только вот сказано, что исправление экспериментальное, а значит есть вероятность, что обнаружатся негативные последствия, из-за которых придётся вернуть всё как было.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Синхронизация редактора с результатами поиска (Show All)

Post by HaRT »

buniak_a_h wrote: Mon 30 Dec, 2019 13:53 Пользуется кто-нить из читающих эту тему плагином RESearch?
Тему читаю, плагином пользуюсь, но не в части Show All. Т.ч. ради меня не надо, а вообще не повредило бы, поскольку автор своё детище, очевидно, давно забросил.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Синхронизация редактора с результатами поиска (Show All)

Post by buniak_a_h »

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 …
Post Reply

Return to “Обсуждение макросов”