От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макросаJohn Doe wrote:Плюс, давайте попробуем сформулировать что же тут требуется от фара, может не так и много.
Как вернуть в плагин результат работы макроса?
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Как вернуть в плагин результат работы макроса?
Re: MacroLib — Far Macro Library
Разжуй про "результат работы".Max Rusov wrote:От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макроса
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: MacroLib — Far Macro Library
Ну, как я понимаю принцип работы виртуальной машины - у нее должен быть стек. Если по окончании работы макроса на верхушке стека осталось значение - то это было выражение. Хотелось бы уметь получить это значение назад в плагин.
Для возврата значения можно расширить структуру ActlKeyMacro.
Кроме того, было бы неплохо ввести в макроязык оператор явно возвращающий значение. Например, расширить $Exit необязательным параметром, чтобы можно было написать как то так:
Для возврата значения можно расширить структуру ActlKeyMacro.
Кроме того, было бы неплохо ввести в макроязык оператор явно возвращающий значение. Например, расширить $Exit необязательным параметром, чтобы можно было написать как то так:
Code: Select all
%Res= ...
$Exit %Res
Re: MacroLib — Far Macro Library
Дело в том, что MCMD_POSTMACROSTRING, который плагины юзают - он просто помещает в очередь исполнения очередную строку (точнее эта строка сначала компилиться, а потом байткод помещается в очередь).Max Rusov wrote:Хотелось бы уметь получить это значение назад в плагин
И... функция AdvControl сразу возвращает управление плагину (результат - успешно или не успешно помещен макрос в очередь исполнения).
На следующем круге опроса событий (мышь, клава, окно, пр.) ядро видит, что у него есть макро-очередь-исполнения и начинает ее исполнять.
можно попробовать сделать (одно из двух):
- что-то типа "GetLastResult()", а в плагине крутить цикл пока MCMD_GETSTATE не вернет 0 - это искуственная синхронизация
- чтобы фар информировал плагин, поместивший макропоследовательность (а может и не только его), что макрос закончил работу и здесь как раз то, отдать что вернули...
Но можно в АПИ ввести еще одну экспортируемую функцию ProcessMacroEvent и уже ее дергать (5 событий уже есть - см. FARMACROSTATE)
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: MacroLib — Far Macro Library
Ну так я с этого и начал.
Под "синхронным режимом" я и имел ввиду, что управление из AdvControl не возвращается, пока макрос не завершится. Т.е., запускается вторичный цикл обработки сообщений. Насколько это сложно сделать в FAR'е - я не представляю, это надо хорошо внутреннюю кухню знать.От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING)
Re: Как вернуть в плагин результат работы макроса?
В принципе не сложно.
АПИ распиши и примерный сценарий (как ты его себе представляешь)...
АПИ распиши и примерный сценарий (как ты его себе представляешь)...
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
Re: Как вернуть в плагин результат работы макроса?
по поводу $exit
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: Как вернуть в плагин результат работы макроса?
ничего. до поры до времени.
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
- John Doe
- Бюрократ
- Posts: 13860
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Как вернуть в плагин результат работы макроса?
$Exit уже есть, и вводить ещё один exit но с другим именем не стоит.Skirda wrote:по поводу $exit
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
P.S.
Как насчёт возможности возвращать не одно, а несколько значений?
Code: Select all
$Exit 1 2 3 4
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: Как вернуть в плагин результат работы макроса?
Imho, это лишнее. Если нужно обмениваться большим объемом данных между макросом и плагином лучше завести понятие "общей памяти" и добавить функции по работе с ней. Хорошим кандидатом, является внутренний буфер обмена. В макросах уже есть с ним работа (clip), если в API добавить возможность туда же писать/читать будет достаточно.John Doe wrote:Как насчёт возможности возвращать не одно, а несколько значений?
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: Как вернуть в плагин результат работы макроса?
До какого времени? Если это функция, то можно написать:Skirda wrote:ничего. до поры до времени.
%A = return(123)
Это как надо понимать?
Re: Как вернуть в плагин результат работы макроса?
Ок, но тогда у $exit будет обязательный параметр - код возврата.
Это приведет к тому, что те макросы, которые юзают $exit либо отваляться, либо будут работать неверно.
(нынешний парсер желает быть лучшим в плане добавки фич, проще всего добавлять функции)
Про функции.
%A = return(123)
В %A ничего не будет помещено, т.к. текущая макропоследовательность на этапе вызова return будет прервана и, либо вернется в предыдущее окружение (если вызвана из eval) либо завершит исполнения макроса (для верхнего уровня)
Можно и не return(), а, скажем exit()
Суть в том, что return() можно будет юзать как обычный выход из вложенных макросов (C/C++/awk/pascal/etc - возврат из функций) - это "до поры до времени"
Это приведет к тому, что те макросы, которые юзают $exit либо отваляться, либо будут работать неверно.
(нынешний парсер желает быть лучшим в плане добавки фич, проще всего добавлять функции)
Про функции.
%A = return(123)
В %A ничего не будет помещено, т.к. текущая макропоследовательность на этапе вызова return будет прервана и, либо вернется в предыдущее окружение (если вызвана из eval) либо завершит исполнения макроса (для верхнего уровня)
Можно и не return(), а, скажем exit()
Суть в том, что return() можно будет юзать как обычный выход из вложенных макросов (C/C++/awk/pascal/etc - возврат из функций) - это "до поры до времени"
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
Re: Как вернуть в плагин результат работы макроса?
...или сделать вторую форму $exit(что-то)?
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: Как вернуть в плагин результат работы макроса?
Мне кажется, что лучше $exit(). Это все-таки языковой оператор, наравне с $continue и пр.