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

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

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

Post by buniak_a_h »

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




В скрипте используется мой модуль "Расширение GetMsg" Уже не используется.
EditorFindAllList.lua.1_4_1.7z
(3.86 KiB) Downloaded 317 times
Версия 1.5.1 - обещанная фильтрация по вхождению в блок (CtrlH)
EditorFindAllList.lua.1_5_1.7z
С фильтрацией. Увы, в списке айденного пропадает раскраска .
(4.39 KiB) Downloaded 324 times
Версия 1.5.5
EditorFindAllList.lua-1-5-5.7z
(4.67 KiB) Downloaded 167 times
Версия 1.5.7
EditorFindAllList.lua-1-5-7.7z
(4.95 KiB) Downloaded 39 times
Версия 1.5.9
EditorFindAllList.lua-1-5-9.7z
(5.2 KiB) Downloaded 24 times
Last edited by buniak_a_h on Thu 02 Oct, 2025 05:10, edited 12 times in total.
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

Latest post of the previous page:

Kadaner wrote: Thu 15 May, 2025 02:05 А реальная экономия произойдёт, когда мне удастся не материализовывать строку меню вообще
Судя по всему, Вы планомерно движетесь от МЕНЮ к диалогу с DI_USERCONTROL-ем. Там тоже строки не хранятся, а формируются "на лету"
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Kadaner wrote: Thu 15 May, 2025 02:05 Координаты будут отображаться, но не будут частью строки элемента меню. Для демонстрации на экране их тоже будут генерировать на лету. А реальная экономия произойдёт, когда мне удастся не материализовывать строку меню вообще. Для отрисовки её тоже будут спрашивать у хозяина меню.
Т.е. вы предлагаете сейчас добавить апи для получения координат, а после дальнейшего усовершенствования этот же апи будет служить для получения и текста?
https://t.me/FarManager — Telegram чат
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

John Doe wrote: Thu 15 May, 2025 10:33 Т.е. вы предлагаете сейчас добавить апи для получения координат, а после дальнейшего усовершенствования этот же апи будет служить для получения и текста?
Вероятнее всего, нет. Я предполагаю симулировать получение текста через существующие API, просто потому, что они уже есть, и незачем их ломать. Но это пока только на уровне идей. Я не знаю, что я реально смогу сделать. Я тут попробовал с наскока кое-что в этом направлении и совершенно увяз из-за предыдущих несколько неудачных решений. У меня есть ещё идеи, но это позже.

По крайней мере, я обещаю, что если я сделаю API для получения координат, оно будет стабильным, насколько это от меня зависит.
buniak_a_h wrote: Thu 15 May, 2025 04:37 Вы планомерно движетесь от МЕНЮ к диалогу с DI_USERCONTROL-ем.
Надо посмотреть. может быть и нет.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Kadaner wrote: Fri 16 May, 2025 02:24 По крайней мере, я обещаю, что если я сделаю API для получения координат
Слишком узкое применение, имхо, чтобы этим заморачиваться вообще.
https://t.me/FarManager — Telegram чат
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

buniak_a_h, в версии 6548 я приделал функцию Menu.GetItemExtendedData() и макрос Edit.SyncEditorAndFindAllMenu.lua с примером её использования (спасибо Shmuel за помощь).

Можно Вас попросить изменить Ваш макрос ещё раз, надеюсь, последний, и использовать эту функцию вместо выковыривания координат найденного образца из строки элемента меню? Это даст мне возможность перестать вставлять номера строк / позиций в каждый элемент.

Заранее благодарен.
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

Kadaner, при реализации столкнулся со следующей "странностью":
у меня вся обработка повешена на ивент группы DialogEvent, на события диалога DN_INITDIALOG, DN_LISTCHANGE и нажатие клавиши . Однако при этом Area.Current = Editor, а Menu.GetItemExtendedData ещё не показывает данных (Line, Ln и Position). Я с таим уже сталкивался в другом месте: диалог уже есть, а поля Dlg.… не проинициализированы (например, Dlg.ItemCount==0!). Я пока не придумал, как это обойти. Может, кто-то из гуру подскажет?
Для определённости: в скрипте есть функция PrepareList, которая собственно и формирует список пар Line,Position. Если туда тупо вставить вызов

Code: Select all

local Coord={Menu.GetItemExtendedData(1)}
, то видно, что указанная функция ничего не возвращает.
Повесить вызов PrepareList на DN_GOTFOCUS и на DN_DRAWDIALOGDONE ситуации не исправляет.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

buniak_a_h, У меня была та же самая проблема. Спасибо Shmuel, который подсказал, как её решить. Надо в обработчике DN_INITDIALOG вместо того, чтобы непосредственно вызывать функцию, исполнять её отложенно при помощи mf.postmacro, как это сделано здесь:

Code: Select all

mf.postmacro(function() SetupMenuAndEditor(FarDialogEvent) end)

Если я правильно понимаю, в момент обработки DN_INITDIALOG диалог ещё не показан, поэтому контекст ещё Editor. А mf.postmacro каким-то магическим образом откладывает исполнение функции до окончания цикла обработки предыдущего события, который включает смену контекста на Menu. В моём макросе всё это работает.

В обработчиках DN_LISTCHANGE и DN_CONTROLINPUT этот трюк не требуется, т.к. контекст уже правильный.
Last edited by Kadaner on Sun 14 Sep, 2025 03:17, edited 4 times in total.
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

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

Post by Shmuel »

Kadaner wrote: Sun 14 Sep, 2025 02:49 А mf.postmacro каким-то магическим образом откладывает исполнение функции до окончания цикла обработки предыдущего события, который включает смену контекста на Menu.
Здесь нет магии. Макросы всегда помещаются в очередь на исполнение. Когда появляется окно меню или диалога, Фар запрашивает ввод от юзера, но в первую очередь он обращается за возможным вводом к макросистеме. Макросистема видит, что есть макрос в очереди и запускает его на исполнение. Таким образом, появление окна служит триггером для запуска макроса из очереди.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

Shmuel wrote: Sun 14 Sep, 2025 12:05 [П]оявление окна служит триггером для запуска макроса из очереди.
Таким образом, можно сказать, что DN_INITDIALOG — это не то событие, где можно получать содержимое. Мы также знаем, что DN_GOTFOCUS и DN_DRAWDIALOGDONE тоже не работают (что несколько более неожиданно). Из нашей приватной переписки, я понял, что "правильного" события нет.

P.S. Я не жалуюсь и не прошу новую фичу (это надо делать не здесь), я просто пытаюсь уложить у себя в голове все эти знания.
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

Kadaner wrote: Sat 13 Sep, 2025 03:01 Можно Вас попросить изменить Ваш макрос
Во вложении изменённый скрипт. Я попрошу Вас проверить на версии ФАРа без вставки номеров строк / позиций в каждый элемент. Я, конечно, попытался сымитировать (т.е. для проверки просто заблокировал "выгрызание" координат из текста пункта МЕНЮ), но не уверен, что сделал всё корректно.
Совместимость со старыми версиями ФАРа, вроде, обеспечена…
EditorFindAllList.lua-1-5-6.7z
Версия 1.5.6 на тестирование
(4.81 KiB) Downloaded 12 times
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

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

Post by zg »

Kadaner wrote: Sun 14 Sep, 2025 16:24Таким образом, можно сказать, что DN_INITDIALOG — это не то событие, где можно получать содержимое. Мы также знаем, что DN_GOTFOCUS и DN_DRAWDIALOGDONE тоже не работают (что несколько более неожиданно).
DN_DRAWDIALOGDONE у меня работает, вы точно far.SubscribeDialogDrawEvents вызвали?
в DN_INITDIALOG прекрасно можно получить содержимое, если использовать хэндл диалога. но вы его не используете.
то, что DN_GOTFOCUS приходит раньше полноценного создания диалога — концептуально, наверное, баг. надо разбираться.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

buniak_a_h wrote: Mon 15 Sep, 2025 04:43 проверить на версии ФАРа без вставки номеров строк / позиций в каждый элемент
Как будто всё работает.



Большое спасибо за быструю реакцию на мой запрос. У меня есть ещё только рабочая ветка, но теперь я могу в любой момент попросить её смёржить.

P.S. Если нужно поэкспериментировать, и Вы можете построить ФАР у себя с этой ветки — на ней элементы списка найденных вхождений не содержат номеров строк и позиций
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

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

Post by Kadaner »

zg wrote: Mon 15 Sep, 2025 10:29 DN_DRAWDIALOGDONE у меня работает, вы точно far.SubscribeDialogDrawEvents вызвали?
Нет, а что это такое?



Подскажите, пожалуйста, как это сделать при помощи far.SubscribeDialogDrawEvents.
zg wrote: Mon 15 Sep, 2025 10:29 в DN_INITDIALOG прекрасно можно получить содержимое, если использовать хэндл диалога. но вы его не используете.
Я правильно понимаю, что для того, чтобы использовать хэндл диалога, надо написать что-то типа FarDialogEvent.hDlg:send(F.DM_MENU_GETEXTENDEDDATA)? Проблема в том, что DM_MENU_GETEXTENDEDDATA не существует. Есть только MCODE_F_MENU_GETEXTENDEDDATA. Или надо как-то иначе?
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

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

Post by zg »

Kadaner wrote: Tue 16 Sep, 2025 03:44Нет, а что это такое?
по умолчанию события, связанные с отрисовкой не приходят в луа-обработчики. на них надо отдельно подписываться с помощью far.SubscribeDialogDrawEvents. вот так, работает:
Kadaner wrote: Tue 16 Sep, 2025 03:44надо написать что-то типа
да.
Kadaner wrote: Tue 16 Sep, 2025 03:44Проблема в том, что DM_MENU_GETEXTENDEDDATA не существует. Есть только MCODE_F_MENU_GETEXTENDEDDATA.
что реализовали, то и есть. не очень понятно, зачем развивать устаревшее апи, которое есть только для совместимости и имеет, в том числе, вот такие вот проблемы.
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

Kadaner wrote: Tue 16 Sep, 2025 03:31 Я заметил несколько опечаток…
Спасибо. В ветку обсуждения скрипта пойдёт исправленная. Ничего, если без ссылки на Вас?
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

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

Post by buniak_a_h »

Вышла версия 1.5.6 (с подачи Kadaner). Начиная с версии 6548 появилась возможность номер строки и позиции найденного образца вставлять в Extended Data элемента МЕНЮ; т.о. нахождение их в тексте стало излишним. Соответственно, стал ненужным синтаксический разбор строки с целью получения координат найденного образца.
Post Reply

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