Как плагину узнать, что посланный макрос отработал?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
Плагин посылает макрос с помощью Info.MacroControl MCTL_SENDSTRING.
Вопрос: Как узнать, что посланный макрос был вызван и отработал?
Есть ли какой-то штатный способ? Если нет, есть ли обходные пути?
Нужно в основном для тестирования. Макросы здорово выручают. С одной стороны
помогают где не хватает какого-то официального АПИ. С другой стороны иногда
просто проще заслать кнопки, да и ближе это к пользовательским сценариям,
что для тестирования неплохо. Но результаты отработанного макроса надо
проверять, а для этого знать, когда.
Но и кроме тестирования найдутся применения.
Вопрос: Как узнать, что посланный макрос был вызван и отработал?
Есть ли какой-то штатный способ? Если нет, есть ли обходные пути?
Нужно в основном для тестирования. Макросы здорово выручают. С одной стороны
помогают где не хватает какого-то официального АПИ. С другой стороны иногда
просто проще заслать кнопки, да и ближе это к пользовательским сценариям,
что для тестирования неплохо. Но результаты отработанного макроса надо
проверять, а для этого знать, когда.
Но и кроме тестирования найдутся применения.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
P.S. В идеале хотелось бы иметь некоторый гибрид MCTL_SENDSTRING и ACTL_SYNCHRO.
Посылаем макрос и колбэк, который Фар вызывает после отработки макроса.
Посылаем макрос и колбэк, который Фар вызывает после отработки макроса.
Как плагину узнать, что посланный макрос отработал?
твой, макрос, это нечто в луа?
если так, то можно пример вызова?
есть одна идея
если так, то можно пример вызова?
есть одна идея
Как плагину узнать, что посланный макрос отработал?
В догонку, кажется что все должно быть гораздо проще,
или я чего-то недопонимаю?
если макрос - это код который ты сам создаешь и посылаешь,
то наверное, в него можно положить все что угодно,
в том числе и некий репорт результатов исполнения.
Опять же, если это в Луа, то 100% можно сделать нечто обще-применительное,
но для начала я так вижу в самом же запусакемом макросе сделать отчет исполнения
или я чего-то недопонимаю?
если макрос - это код который ты сам создаешь и посылаешь,
то наверное, в него можно положить все что угодно,
в том числе и некий репорт результатов исполнения.
Опять же, если это в Луа, то 100% можно сделать нечто обще-применительное,
но для начала я так вижу в самом же запусакемом макросе сделать отчет исполнения
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
citRiks, не понял вопрос. Пример, скажем, обернутый как FarNet \ PowerShellFar \ PowerShell, выглядит так
https://github.com/nightroman/FarNet/bl ... og.fas.ps1
Это тестовый скрипт с типичной последовательностью keys (macro) и job {проверка результатов} следом.
Как вы понимаете, это работает, ибо грязный хак-таки придуман, опишу в след. посте.
https://github.com/nightroman/FarNet/bl ... og.fas.ps1
Это тестовый скрипт с типичной последовательностью keys (macro) и job {проверка результатов} следом.
Как вы понимаете, это работает, ибо грязный хак-таки придуман, опишу в след. посте.
Как плагину узнать, что посланный макрос отработал?
..вдогонку номер три:
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
джентельменский набор АПИ не отвечает на вопрос?
https://api.farmanager.com/ru/service_f ... TLASTERRORПолучить расширенную диагностику об ошибке проверки макроса или скрипта
(после исполнения команды MCTL_SENDSTRING или MCTL_EXECSTRING)
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
джентельменский набор АПИ не отвечает на вопрос?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
Грязный хак такой.
Посылаю два макроса: один тот, который нужен, другой вспомогательный, который, докладывает "результат".
(предположение, возможно, не всегда верное - если второй макрос вызван, то первый отработал)
Затем в параллельном потоке в цикле с небольшими задержками проверяю этот "результат".
Если результат есть, то можно продолжать дальше.
Почему два макроса, а не один склеенный? Для чистоты сообщений об ошибках в макросе, если они есть.
Не очень все это красиво... В принципе, это работает почти всегда.
Но во-первых, не всегда и это трудно даже представить, как баг, скажем, Фара, может и у меня что-то не так, ибо сложно все.
А во-вторых, откровенно ест время такой подход. Для одиночного макроса это неважно.
А для авто тестов с кучей таких вызовов, которые надо прогнать после любых изменений, имеет значение.
Посылаю два макроса: один тот, который нужен, другой вспомогательный, который, докладывает "результат".
(предположение, возможно, не всегда верное - если второй макрос вызван, то первый отработал)
Затем в параллельном потоке в цикле с небольшими задержками проверяю этот "результат".
Если результат есть, то можно продолжать дальше.
Почему два макроса, а не один склеенный? Для чистоты сообщений об ошибках в макросе, если они есть.
Не очень все это красиво... В принципе, это работает почти всегда.
Но во-первых, не всегда и это трудно даже представить, как баг, скажем, Фара, может и у меня что-то не так, ибо сложно все.
А во-вторых, откровенно ест время такой подход. Для одиночного макроса это неважно.
А для авто тестов с кучей таких вызовов, которые надо прогнать после любых изменений, имеет значение.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
Хм, может, я слона не заметил? MCTL_EXECSTRING исполняется синхронно? Если да, то, может и огород не надо городить, а просто использовать MCTL_EXECSTRING. Надо будет попробовать.
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как плагину узнать, что посланный макрос отработал?
MCTL_EXECSTRING, именно потому что синхронный, имеет ограничения - в него нельзя помещать асинхронные вызовы типа Keys().
Из имеющихся средств можно воспользоваться:
1) вызов Plugin.SyncCall(<ваш плагин>, <параметры>) - из любого места макроса. Позволяет обмениваться информацией с плагином.
2) в начало любого макроса можно вставить mf.AddExitHandler(Plugin.SyncCall, <ваш плагин>, <параметры>) - это частный случай пункта 1, примерно соответствующий вашему исходному запросу.
Из имеющихся средств можно воспользоваться:
1) вызов Plugin.SyncCall(<ваш плагин>, <параметры>) - из любого места макроса. Позволяет обмениваться информацией с плагином.
2) в начало любого макроса можно вставить mf.AddExitHandler(Plugin.SyncCall, <ваш плагин>, <параметры>) - это частный случай пункта 1, примерно соответствующий вашему исходному запросу.
Как плагину узнать, что посланный макрос отработал?
читал всякие readme, но не очень помогло,
что-то я не могу запустить ваш пример опять.
Вроде надо делать как тут написано:
.. и особенно по пункту "PowerShellFar async scripts":
но получается что-то совсем не то:
как ему помочь найти эту переменную, или чего ему не хватает?
что-то я не могу запустить ваш пример опять.
Вроде надо делать как тут написано:
.. и особенно по пункту "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 ] ║
╚══════════════════════════════════════════════════════════════════════╝
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
Жаль, основная цель как раз Keys(). Но пригодится для других случаев, полезно, спасибо.
(1) пробовал, не работает аналогично моему хаку, и разобраться пока не смог почему, а хак работает, "как надо".
(2) а вот это надо будет отдельно попробовать, ибо да, почти то, что я спрашивал.
Спасибо!
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
citRiks,
Для этого еще нужен скрипт ..\Tests\Test-Dialog.far.ps1
Code: Select all
ps: Start-FarTask Test-Dialog.fas.ps1 -Confirm
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как плагину узнать, что посланный макрос отработал?
Аналогично вашему хаку может быть будет поместить в начале макроса:
mf.AddExitHandler(mf.postmacro, Plugin.SyncCall, <ваш плагин>, <параметры>)
Как плагину узнать, что посланный макрос отработал?
NightRoman,
да, так все получилось, после того как скопировал все *.ps1 отсюда:
https://github.com/nightroman/FarNet/tr ... erShellFar
в сюда:
%FarHome%\FarNet\Modules\PowerShellFar\
Ну я так понимаю Шмуэль дал исчерпывающий ответ.
Кроме того, если это сильно того надо,
то в LuaJit можно навставлять любых хуков в любое место.
что касается синхронности-асинхронности - ну так или иначе обходится,
с большими или меньшими затратами времени и нервов,
но что-то можно придумать.
Я как пример приведу,
я ранее возмущался "почему Луа а не жабаскрипт", теперь уже не возмущаюсь.
потому что в жабаскрипте возможно запечатать обьект (его среду), а в Луа нельзя.
да, так все получилось, после того как скопировал все *.ps1 отсюда:
https://github.com/nightroman/FarNet/tr ... erShellFar
в сюда:
%FarHome%\FarNet\Modules\PowerShellFar\
Ну я так понимаю Шмуэль дал исчерпывающий ответ.
Кроме того, если это сильно того надо,
то в LuaJit можно навставлять любых хуков в любое место.
что касается синхронности-асинхронности - ну так или иначе обходится,
с большими или меньшими затратами времени и нервов,
но что-то можно придумать.
Я как пример приведу,
я ранее возмущался "почему Луа а не жабаскрипт", теперь уже не возмущаюсь.
потому что в жабаскрипте возможно запечатать обьект (его среду), а в Луа нельзя.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Как плагину узнать, что посланный макрос отработал?
Shmuel,
Еще раз попробовал и (1), и (2), и уточненный (2). Вот что получается (не то, что надо):
мой скрипт такой
Что ожидаем от него: открываем диалог Apply command в панелях, там печатаем "123" (затем проверяем "123", но в примере просто показываем в другом диалоге).
Что получается: по-разному, но чаще вот что: в диалоге напечатало только "1"
Еще раз попробовал и (1), и (2), и уточненный (2). Вот что получается (не то, что надо):
мой скрипт такой
Code: Select all
keys "CtrlG 1 2 3"
job {
$Far.Message($Far.Dialog[2].Text)
}
Что получается: по-разному, но чаще вот что: в диалоге напечатало только "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.