View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000621 | Far Manager 1.7x | Macro | public | 2008-10-22 04:34 | 2008-11-06 07:29 |
Reporter | HaRT | Assigned To | vskirdin | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 1.71 | ||||
Fixed in Version | 1.71 | ||||
Summary | 0000621: Макрос из плагина не отрабатывает, если тот вызван через функцию eval | ||||
Description | Nikolay писал(а): Технически говоря, AdvControl с ACTL_KEYMACRO + MCMD_POSTMACROSTRING хотя и возвращает УСПЕХ, но не отрабатывает совсем, если вызов плагина произошёл через макрофункцию eval. | ||||
Steps To Reproduce | 0. Установлен и загружен плагин AltHistory 2.1.0; горячая клавиша - '@'. Все последующие пункты подразумевают, что история вызвана из какого-нибудь стандартного диалога (например, доступного по ShiftF4). 1. Назначаю в диалогах такие макросы: AltF11: $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 2 $End AltF12: $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 3 $End AltF8 : $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 1 4 $End Всё работает, как ожидалось, - из Истории можно переключаться в другие Истории с сохранением введённого фильтра. 2. Обрамляю каждый макрос в eval: AltF11: eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 2 $End" ) AltF12: eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 3 $End" ) AltF8 : eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 1 4 $End" ) Переключение между Историями уже НЕ работает, 3. Если вызываю Историю по AltF12 и там нажимаю Ctrl. AltF11 Ctrl. Esc, то после этого переключение между Историями начинает работать (пока не закроешь Историю). | ||||
Additional Information | http://forum.farmanager.com/viewtopic.php?p=36045#p36045 | ||||
Tags | No tags attached. | ||||
Build | 2446 | ||||
|
На сколько я могу понять, переменную %%AltHistoryDialogActive выставляет плагин, так? Это к тому, что если, например, Alt-F12 сделать без eval и ее вызвать первой, то дальше все работает нормально, иначе как ты и описал. Видимо... ФАР где-то "глотает" %%AltHistoryDialogActive (это мои домыслы :-)) |
|
> переменную %%AltHistoryDialogActive выставляет плагин, так? > Alt-F12 сделать без eval и ее вызвать первой, то дальше все работает нормально Да и да. |
|
Что-то я ума не дам как проблему решить. Проблема в том, что %%AltHistoryDialogActive плагин выставляет в сеансе eval`а... Но потом происходит зачистка окружения и... в общем долгая история. Ее решать надо... - долго думать и все такое 8-) Кстати, первый вызов макроса без eval переменную выставляет, а последующие вызовы (с eval) только паразитируют на этом значении, херя в конце своей работы (когда из eval вышли) байткод для строки плагина "%%AltHistoryDialogActive=1;" (и, соответсвтенно, не выставляя эту переменную). Пока могу предложить воркэраунд: ввести в строй MCMD_SETVAR, MCMD_GETVAR, MCMD_SETCONST, MCMD_GETCONST и соответствующую им структуру (в составе ActlKeyMacro): struct { const char *Name; union { const char *s; __int64 i; } Value; } MacroValue; Эти команды позволят плагину манипулировать значениями из глобальных таблиц констант (макроконстанты неизменяемы только из макроса...) и переменных, минуя макро-очереди. ы? |
|
> AdvControl с ACTL_KEYMACRO + MCMD_POSTMACROSTRING хотя и возвращает УСПЕХ Естественно AdvControl вернет успех - компиляция в байткод и помещение кода в рабочую область прошла успешно. Дело в другом (выше). |
|
Есть надежда, что проблема потеряет свою актуальность в ближайших версиях плагина AltHistory. Если не потеряет, тогда можно будет к ней вернуться. |
|
Не в надежде дело а в реальном баге. AltHistory - это первая ласточка. Не все же будут переделывать свои плагины... |
|
Кхе... оказалось все очень просто :-) 1. запускается макрос, код помещается в рабочую зону 2. срабатывает eval, делает новое рабочее окружение (push) и помещает новый код 3. доходит дело до плагина - добавляется новый код "%%AltHistoryDialogActive=1;" в туже зону 4. помещенный eval`ом код говорит "end" и происходит восстановление (pop) предыдущей рабочей зоны, несмотря на то, что в текущей зоне еще остался макрокод от плагина. 5. завершается основной код и... ...и все. В общем не стояла проверка для п.4, т.е. теперь смотрим, что если что-то в рабочей зоне осталось, то не делаем pop, а пытаемся завершить все дела в этой текущей зоне. проверям - http://ifolder.ru/8711009 проверять желательно _все_ макросы, особенно юзающие eval. |
|
работает тестовый билд? решением ставим? |
|
> работает тестовый билд? Каких-то видимых поломок пока не замечено. С формальным одобрением подожду до того момента, когда эти изменения войдут в публичную сборку. |
|
у меня тоже всё ok |
|
после 576/2446 |
|
Проверено на сборке 2449 |
Date Modified | Username | Field | Change |
---|---|---|---|
2008-10-22 04:34 | HaRT | New Issue | |
2008-10-22 04:34 | HaRT | Status | new => assigned |
2008-10-22 04:34 | HaRT | Assigned To | => vskirdin |
2008-10-22 12:27 | vskirdin | Note Added: 0001885 | |
2008-10-22 12:29 | HaRT | Note Added: 0001886 | |
2008-10-23 08:27 | vskirdin | Note Added: 0001887 | |
2008-10-23 08:29 | vskirdin | Note Added: 0001888 | |
2008-10-23 08:32 | HaRT | Note Added: 0001889 | |
2008-10-23 08:39 | vskirdin | Note Added: 0001890 | |
2008-10-23 10:19 | vskirdin | Note Added: 0001891 | |
2008-10-24 07:16 | vskirdin | Note Added: 0001892 | |
2008-10-24 07:16 | vskirdin | Status | assigned => feedback |
2008-10-24 12:18 | HaRT | Note Added: 0001894 | |
2008-10-24 12:19 | HaRT | Note Edited: 0001894 | |
2008-10-25 08:38 | sdindikov | Note Added: 0001896 | |
2008-10-27 01:43 | vskirdin | Note Added: 0001899 | |
2008-11-06 04:56 | HaRT | Status | feedback => resolved |
2008-11-06 04:56 | HaRT | Resolution | open => fixed |
2008-11-06 04:56 | HaRT | Note Added: 0001932 | |
2008-11-06 07:29 | vskirdin | Build | => 2446 |
2008-11-06 07:29 | vskirdin | Status | resolved => closed |
2008-11-06 07:29 | vskirdin | Fixed in Version | => 1.71 |