Как вернуть в плагин результат работы макроса?

Место, где разработчики плагинов могут поделиться своим опытом.
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Как вернуть в плагин результат работы макроса?

Post by Max Rusov »

John Doe wrote:Плюс, давайте попробуем сформулировать что же тут требуется от фара, может не так и много.
От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макроса
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: MacroLib — Far Macro Library

Post by Skirda »

Max Rusov wrote:От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макроса
Разжуй про "результат работы".
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: MacroLib — Far Macro Library

Post by Max Rusov »

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

Для возврата значения можно расширить структуру ActlKeyMacro.

Кроме того, было бы неплохо ввести в макроязык оператор явно возвращающий значение. Например, расширить $Exit необязательным параметром, чтобы можно было написать как то так:

Code: Select all

%Res= ...
$Exit %Res
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: MacroLib — Far Macro Library

Post by Skirda »

Max Rusov wrote:Хотелось бы уметь получить это значение назад в плагин
Дело в том, что MCMD_POSTMACROSTRING, который плагины юзают - он просто помещает в очередь исполнения очередную строку (точнее эта строка сначала компилиться, а потом байткод помещается в очередь).
И... функция AdvControl сразу возвращает управление плагину (результат - успешно или не успешно помещен макрос в очередь исполнения).
На следующем круге опроса событий (мышь, клава, окно, пр.) ядро видит, что у него есть макро-очередь-исполнения и начинает ее исполнять.

можно попробовать сделать (одно из двух):
  1. что-то типа "GetLastResult()", а в плагине крутить цикл пока MCMD_GETSTATE не вернет 0 - это искуственная синхронизация :-)
  2. чтобы фар информировал плагин, поместивший макропоследовательность (а может и не только его), что макрос закончил работу и здесь как раз то, отдать что вернули...
В последнем случае ProcessEvent (как кандидат) здесь не подойдет - натяжка получается (не к месту).
Но можно в АПИ ввести еще одну экспортируемую функцию ProcessMacroEvent и уже ее дергать (5 событий уже есть :-) - см. FARMACROSTATE)
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: MacroLib — Far Macro Library

Post by Max Rusov »

Ну так я с этого и начал.
От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING)
Под "синхронным режимом" я и имел ввиду, что управление из AdvControl не возвращается, пока макрос не завершится. Т.е., запускается вторичный цикл обработки сообщений. Насколько это сложно сделать в FAR'е - я не представляю, это надо хорошо внутреннюю кухню знать.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Как вернуть в плагин результат работы макроса?

Post by Skirda »

В принципе не сложно.
АПИ распиши и примерный сценарий (как ты его себе представляешь)...
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Как вернуть в плагин результат работы макроса?

Post by Skirda »

по поводу $exit
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Как вернуть в плагин результат работы макроса?

Post by Max Rusov »

Какая же это функция? Что она будет возвращать?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Как вернуть в плагин результат работы макроса?

Post by Skirda »

ничего. до поры до времени.
We are the Borg. You will be assimilated.
So Say We All!
User avatar
John Doe
Бюрократ
Posts: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

Re: Как вернуть в плагин результат работы макроса?

Post by John Doe »

Skirda wrote:по поводу $exit
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
$Exit уже есть, и вводить ещё один exit но с другим именем не стоит.

P.S.
Как насчёт возможности возвращать не одно, а несколько значений?

Code: Select all

$Exit 1 2 3 4
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Как вернуть в плагин результат работы макроса?

Post by Max Rusov »

John Doe wrote:Как насчёт возможности возвращать не одно, а несколько значений?
Imho, это лишнее. Если нужно обмениваться большим объемом данных между макросом и плагином лучше завести понятие "общей памяти" и добавить функции по работе с ней. Хорошим кандидатом, является внутренний буфер обмена. В макросах уже есть с ним работа (clip), если в API добавить возможность туда же писать/читать будет достаточно.
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Как вернуть в плагин результат работы макроса?

Post by Max Rusov »

Skirda wrote:ничего. до поры до времени.
До какого времени? Если это функция, то можно написать:

%A = return(123)

Это как надо понимать? :?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Как вернуть в плагин результат работы макроса?

Post by Skirda »

Ок, но тогда у $exit будет обязательный параметр - код возврата.
Это приведет к тому, что те макросы, которые юзают $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!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

Re: Как вернуть в плагин результат работы макроса?

Post by Skirda »

...или сделать вторую форму $exit(что-то)?
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Как вернуть в плагин результат работы макроса?

Post by Max Rusov »

Мне кажется, что лучше $exit(). Это все-таки языковой оператор, наравне с $continue и пр.
Post Reply

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