Как плагину узнать, что посланный макрос отработал?

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Плагин посылает макрос с помощью Info.MacroControl MCTL_SENDSTRING.
Вопрос: Как узнать, что посланный макрос был вызван и отработал?
Есть ли какой-то штатный способ? Если нет, есть ли обходные пути?

Нужно в основном для тестирования. Макросы здорово выручают. С одной стороны
помогают где не хватает какого-то официального АПИ. С другой стороны иногда
просто проще заслать кнопки, да и ближе это к пользовательским сценариям,
что для тестирования неплохо. Но результаты отработанного макроса надо
проверять, а для этого знать, когда.

Но и кроме тестирования найдутся применения.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

P.S. В идеале хотелось бы иметь некоторый гибрид MCTL_SENDSTRING и ACTL_SYNCHRO.
Посылаем макрос и колбэк, который Фар вызывает после отработки макроса.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

твой, макрос, это нечто в луа?
если так, то можно пример вызова?
есть одна идея
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

В догонку, кажется что все должно быть гораздо проще,
или я чего-то недопонимаю?
если макрос - это код который ты сам создаешь и посылаешь,
то наверное, в него можно положить все что угодно,
в том числе и некий репорт результатов исполнения.
Опять же, если это в Луа, то 100% можно сделать нечто обще-применительное,
но для начала я так вижу в самом же запусакемом макросе сделать отчет исполнения
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

citRiks, не понял вопрос. Пример, скажем, обернутый как FarNet \ PowerShellFar \ PowerShell, выглядит так
https://github.com/nightroman/FarNet/bl ... og.fas.ps1

Это тестовый скрипт с типичной последовательностью keys (macro) и job {проверка результатов} следом.

Как вы понимаете, это работает, ибо грязный хак-таки придуман, опишу в след. посте.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

..вдогонку номер три:
Получить расширенную диагностику об ошибке проверки макроса или скрипта
(после исполнения команды MCTL_SENDSTRING или MCTL_EXECSTRING)
https://api.farmanager.com/ru/service_f ... TLASTERROR
https://api.farmanager.com/ru/structure ... otext.html
https://api.farmanager.com/ru/structure ... esult.html
https://api.farmanager.com/ru/service_f ... SENDSTRING
https://api.farmanager.com/ru/service_f ... EXECSTRING

джентельменский набор АПИ не отвечает на вопрос?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Грязный хак такой.

Посылаю два макроса: один тот, который нужен, другой вспомогательный, который, докладывает "результат".
(предположение, возможно, не всегда верное - если второй макрос вызван, то первый отработал)

Затем в параллельном потоке в цикле с небольшими задержками проверяю этот "результат".
Если результат есть, то можно продолжать дальше.

Почему два макроса, а не один склеенный? Для чистоты сообщений об ошибках в макросе, если они есть.

Не очень все это красиво... В принципе, это работает почти всегда.
Но во-первых, не всегда и это трудно даже представить, как баг, скажем, Фара, может и у меня что-то не так, ибо сложно все.

А во-вторых, откровенно ест время такой подход. Для одиночного макроса это неважно.
А для авто тестов с кучей таких вызовов, которые надо прогнать после любых изменений, имеет значение.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Хм, может, я слона не заметил? MCTL_EXECSTRING исполняется синхронно? Если да, то, может и огород не надо городить, а просто использовать MCTL_EXECSTRING. Надо будет попробовать.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Как плагину узнать, что посланный макрос отработал?

Post by Shmuel »

MCTL_EXECSTRING, именно потому что синхронный, имеет ограничения - в него нельзя помещать асинхронные вызовы типа Keys().

Из имеющихся средств можно воспользоваться:
1) вызов Plugin.SyncCall(<ваш плагин>, <параметры>) - из любого места макроса. Позволяет обмениваться информацией с плагином.
2) в начало любого макроса можно вставить mf.AddExitHandler(Plugin.SyncCall, <ваш плагин>, <параметры>) - это частный случай пункта 1, примерно соответствующий вашему исходному запросу.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

читал всякие readme, но не очень помогло,
что-то я не могу запустить ваш пример опять.
Вроде надо делать как тут написано:

.. и особенно по пункту "PowerShellFar async scripts":
ps:Start-FarTask -Script (Get-FarPath) #
но получается что-то совсем не то:

Code: Select all

 ╔═══════════════════════════ FarTask error ════════════════════════════╗
 ║ The variable '$Far' cannot be retrieved because it has not been set. ║
 ╟──────────────────────────────────────────────────────────────────────╢
 ║                           { Ok } [ More ]                            ║
 ╚══════════════════════════════════════════════════════════════════════╝
как ему помочь найти эту переменную, или чего ему не хватает?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Shmuel wrote: Fri 01 Jan, 2021 21:29 MCTL_EXECSTRING, именно потому что синхронный, имеет ограничения - в него нельзя помещать асинхронные вызовы типа Keys().
Жаль, основная цель как раз Keys(). Но пригодится для других случаев, полезно, спасибо.
Shmuel wrote: Fri 01 Jan, 2021 21:29 Из имеющихся средств можно воспользоваться:
(1) пробовал, не работает аналогично моему хаку, и разобраться пока не смог почему, а хак работает, "как надо".
(2) а вот это надо будет отдельно попробовать, ибо да, почти то, что я спрашивал.
Спасибо!
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

citRiks,

Code: Select all

ps: Start-FarTask Test-Dialog.fas.ps1 -Confirm
Для этого еще нужен скрипт ..\Tests\Test-Dialog.far.ps1
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Как плагину узнать, что посланный макрос отработал?

Post by Shmuel »

NightRoman wrote: Fri 01 Jan, 2021 21:41 не работает аналогично моему хаку
Аналогично вашему хаку может быть будет поместить в начале макроса:
mf.AddExitHandler(mf.postmacro, Plugin.SyncCall, <ваш плагин>, <параметры>)
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

NightRoman,
да, так все получилось, после того как скопировал все *.ps1 отсюда:
https://github.com/nightroman/FarNet/tr ... erShellFar
в сюда:
%FarHome%\FarNet\Modules\PowerShellFar\

Ну я так понимаю Шмуэль дал исчерпывающий ответ.
Кроме того, если это сильно того надо,
то в LuaJit можно навставлять любых хуков в любое место.
что касается синхронности-асинхронности - ну так или иначе обходится,
с большими или меньшими затратами времени и нервов,
но что-то можно придумать.

Я как пример приведу,
я ранее возмущался "почему Луа а не жабаскрипт", теперь уже не возмущаюсь.
потому что в жабаскрипте возможно запечатать обьект (его среду), а в Луа нельзя.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Shmuel,
Еще раз попробовал и (1), и (2), и уточненный (2). Вот что получается (не то, что надо):

мой скрипт такой

Code: Select all

keys "CtrlG 1 2 3"
job {
	$Far.Message($Far.Dialog[2].Text)
}
Что ожидаем от него: открываем диалог Apply command в панелях, там печатаем "123" (затем проверяем "123", но в примере просто показываем в другом диалоге).
Что получается: по-разному, но чаще вот что: в диалоге напечатало только "1"

Code: Select all

╔══════════════════════════   ╔════════╗   ══════════════════════════╗
║ Enter command to process    ║   1    ║                             ║
║ 1                           ╟────────╢                            ↓║
╟──────────────────────────   ║ { OK } ║   ──────────────────────────╢
║                         {   ╚════════╝                             ║
╚══════════════════════════                ══════════════════════════╝
Last edited by NightRoman on Fri 01 Jan, 2021 22:15, edited 1 time in total.
Post Reply

Return to “Разработка плагинов”