View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002222 | Far Manager | Macro | public | 2012-12-11 07:42 | 2013-05-07 15:38 |
Reporter | NightRoman | Assigned To | shmuel | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0002222: MacroControl MCTL_SENDSTRING возвращает 0 при "Keys('F11') Menu.Select('FarNet', 2) Keys('Enter')" | ||||
Description | Far 3.0.3003, но это не последние изменения виноваты. Трудно сказать, когда появилась проблема, но до перехода на Lua это работало, например, есть еще у меня Far 3.0.2850, и он работает. К сожалению, воспроизвести не так просто без установки плагина. Нужен плагин FarNet и один из его модулей с ком.строкой, простейший вариант - RightControl. И то, и то можно найти тут http://code.google.com/p/farnet/downloads/list, и надо читать файл About-FarNet о том, как устанавливать. Проще может быть, если посмотрит кто-то, у кого уже стоит FarNet и модуль PowerShellFar, например, с ним тоже можно воспроизвести. Когда все поставлено, то воспроизводится простым запуском из ком.строки: Для модуля RightControl подойдет такая команда: macro:post Plugin.Call("10435532-9BB3-487B-A045-B0E6ECAAB6BC", "::RightControl:step-left") (эта команда ничего не делает по сути при запуске из пустой ком.строки) А для PowerShellFar, например, такая: macro:post Plugin.Call("10435532-9BB3-487B-A045-B0E6ECAAB6BC", "::>: 1") (эта команда должна просто вывести 1 на консоль Фара) Сейчас обе команды приводят к исключению в FarNet, которое выбрасывается (осознанно, это задуманное исключение) при проверке кода возврата из MacroControl. Сейчас перестал работать целый пласт специальных команд "::", которые вызываются хитрым способом из макросов через меню плагинов F11, что позволяет, например, панели открывать из обработчиков таких команд в модулях (актуально для PowerShellFar). Попутная деталь. Если после сбоя повторить команду, то ничего не происходит, как будто вызов игнорируется и вызов плагина не происходит. Странно немного. Но это следует учесть. Для повторного воспроизведения надо перезапустить Фар. Пытался отлаживать. В KeyMacro::PostNewMacro (macro.cpp) у меня m_InternalInput равен 1 и поэтому происходит выход с false при проверке. Но что это такое, что m_InternalInput не 0, я не могу сказать. Не исключено, что это я вообще не то что-то смотрел, конечно. | ||||
Tags | No tags attached. | ||||
Build | 3394 | ||||
|
Я бы посмотрел, но боюсь застрять с установкой фарнета с компанией, да и разбираться в том, что он делает при тех или иных вызовах надо. Может быть лучше опиши пошагово, что делает RightControl при его вызове макросом, и я это смоделирую своим плагином. |
|
DrKnS, если не ошибаюсь, имеет и Фарнет, и PowerShellFar. Может, его попросить глянуть в отладчике? Иначе, думаю, сделать, как я описал - самый простой способ. Это не так и сложно, просто надо сделать правильно, поэтому и читать надо, как это делается. А RightContol ничего не делает, до его вызова не доходит. Это Фарнет моделирует вызов по Ф11 через Plugin.Call. |
|
Кроме того, есть еще одна проблема, которую лучше на готовых плагине Фарнет и его модуле PowerShellFar смотреть, но ее я опишу, когда с этим тикетом ясно станет. Может, проблема разрешится, но может и нет. |
|
Однако, пошагово тоже опишу, что делает Фарнет для эмуляции вызова по Ф11 из макроса из Plugin.Call. Это большая регрессия, имхо, и я очень заинтересован в том, чтобы это было исправлено. Используется эта техника редко, поэтому и поздно было замечено, но метко. |
|
По шагам. При вызове описанного макроса Plugin.Call приводит к вызову Фарнет OpenW c OPEN_FROMMACRO и текстовым аргументом "::RightControl:step-left". По соглашению в Фарнет, префикс :: используется для вызова команды модуля "RightControl:step-left", эмулированный через Ф11. Как это делается. В OpenW Фарнет пока ничего не делает, а просто 1) запоминает команду модуля "RightControl:step-left" на потом; 2) вызывает MacroControl с MCTL_SENDSTRING, KMFLAGS_DISABLEOUTPUT, и макросом "Keys('F11') Menu.Select('FarNet', 2) Keys('Enter')". Тут MacroControl и возвращает 0, и Фарнет бросает исключение. Раньше же MacroControl отрабатывал, и Фарнет после постановки макроса просто выходил из OpenW и отдавал управление Фару. Фар получал управление, видел, что у него есть посланный макрос, и проигрывал его. При этом вызывалось меню Ф11 и оттуда пункт Фарнета уже через меню плагинов. Фарнет выдел, что у него запомнена команда "RightControl:step-left" и вызывал модуль RightControl с его командой "step-left". Фича в том, что этот вызов идет через меню плагинов, и в такой команде можно, например, открыть панель, чего при обычном вызове из Plugin.Call не сделаешь. |
|
Перечитал. На самом деле, может, и просто все воспроизвести и без Фарнет. Можно перефразировать, кажется - "MacroControl не работает при вызове через Plugin.Call". Если это так, то тогда Фарнет и не понадобится (для этой проблемы, но я за пазухой еще одну держу :)). |
|
Подтверждаю. Раньше в MacroLib работал такой прием: macro Key="AltX" {{ msgbox("1") MacroLib = "84884660-5B2F-4581-9282-96E00AE109A2" Plugin.Call(MacroLib, "call Macro2") }} macro Name="Macro2" {{ msgbox("2") }} С внедрением LUA это перестало работать (Macro2 не отрабатывает). Мне кажется это та же проблема, о которой говорит Роман. |
|
3394. |
|
Работает, спасибо. |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-12-11 07:42 | NightRoman | New Issue | |
2012-12-12 22:04 | shmuel | Note Added: 0009840 | |
2012-12-13 04:30 | NightRoman | Note Added: 0009841 | |
2012-12-13 04:43 | NightRoman | Note Added: 0009842 | |
2012-12-13 04:47 | NightRoman | Note Added: 0009843 | |
2012-12-13 05:09 | NightRoman | Note Added: 0009844 | |
2012-12-13 05:14 | NightRoman | Note Added: 0009845 | |
2012-12-13 07:12 | max rusov | Note Added: 0009846 | |
2012-12-13 07:14 | max rusov | Note Edited: 0009846 | |
2013-05-07 14:46 | shmuel | Note Added: 0010947 | |
2013-05-07 14:46 | shmuel | Assigned To | => shmuel |
2013-05-07 14:46 | shmuel | Status | new => feedback |
2013-05-07 15:24 | NightRoman | Note Added: 0010948 | |
2013-05-07 15:24 | NightRoman | Status | feedback => assigned |
2013-05-07 15:24 | NightRoman | Status | assigned => resolved |
2013-05-07 15:38 | shmuel | Build | => 3394 |
2013-05-07 15:38 | shmuel | Status | resolved => closed |
2013-05-07 15:38 | shmuel | Resolution | open => fixed |
2013-05-07 15:38 | shmuel | Fixed in Version | => 3.0 |