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

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

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

Post by Max Rusov » Thu 13 Jan, 2011 09:25

John Doe wrote:Плюс, давайте попробуем сформулировать что же тут требуется от фара, может не так и много.
От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макроса

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: MacroLib — Far Macro Library

Post by Skirda » Thu 13 Jan, 2011 10:43

Max Rusov wrote:От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING) + возможность получить результат работы макроса
Разжуй про "результат работы".
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

Re: MacroLib — Far Macro Library

Post by Max Rusov » Thu 13 Jan, 2011 11:03

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

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

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

Code: Select all

%Res= ...
$Exit %Res

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

Re: MacroLib — Far Macro Library

Post by Skirda » Fri 14 Jan, 2011 16:02

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: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

Re: MacroLib — Far Macro Library

Post by Max Rusov » Fri 14 Jan, 2011 16:09

Ну так я с этого и начал.
От FAR'а хотелось бы возможности исполнять макро в синхронном режиме (типа MCMD_RUNMACROSTRING)
Под "синхронным режимом" я и имел ввиду, что управление из AdvControl не возвращается, пока макрос не завершится. Т.е., запускается вторичный цикл обработки сообщений. Насколько это сложно сделать в FAR'е - я не представляю, это надо хорошо внутреннюю кухню знать.

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Fri 14 Jan, 2011 17:30

В принципе не сложно.
АПИ распиши и примерный сценарий (как ты его себе представляешь)...
We are the Borg. You will be assimilated.
So Say We All!

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Fri 14 Jan, 2011 20:33

по поводу $exit
имеет смысл заменить ЭТО на более универсальное - функцию return([N])
она будет и останавливать макрос и возвращать значение (там где это надо) и...
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

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

Post by Max Rusov » Fri 14 Jan, 2011 20:39

Какая же это функция? Что она будет возвращать?

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Fri 14 Jan, 2011 22:14

ничего. до поры до времени.
We are the Borg. You will be assimilated.
So Say We All!

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 16 times
Been thanked: 100 times

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

Post by John Doe » Fri 14 Jan, 2011 22:25

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

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

Code: Select all

$Exit 1 2 3 4

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

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

Post by Max Rusov » Fri 14 Jan, 2011 22:47

John Doe wrote:Как насчёт возможности возвращать не одно, а несколько значений?
Imho, это лишнее. Если нужно обмениваться большим объемом данных между макросом и плагином лучше завести понятие "общей памяти" и добавить функции по работе с ней. Хорошим кандидатом, является внутренний буфер обмена. В макросах уже есть с ним работа (clip), если в API добавить возможность туда же писать/читать будет достаточно.

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

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

Post by Max Rusov » Fri 14 Jan, 2011 22:50

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

%A = return(123)

Это как надо понимать? :?

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Mon 17 Jan, 2011 13:36

Ок, но тогда у $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: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Mon 17 Jan, 2011 13:51

...или сделать вторую форму $exit(что-то)?
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

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

Post by Max Rusov » Mon 17 Jan, 2011 13:53

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

User avatar
John Doe
Бюрократ
Posts: 11387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 16 times
Been thanked: 100 times

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

Post by John Doe » Mon 17 Jan, 2011 13:54

На худой конец exit(), но не return().
Или же result(), пусть он не завершает макрос, а только лишь определяет возвращаемое значение.

Post Reply

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