Переименовать callplugin

Здесь обсуждается всё, что касается макросов.
Locked
User avatar
John Doe
Бюрократ
Posts: 12360
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 17:20

Latest post of the previous page:

Например почему просто не воспользоваться асинхронным Plugin.Call?

Code: Select all

plugin.call("C941E865-9C29-485C-99B3-0C710940F2D8")
ShiftRight ShiftRight ShiftDown ShiftDown ShiftLeft ShiftLeft ShiftUp ShiftUp ShiftRight Esc
Ведь так и callplugin можно сделать асинхронным (всё равно он ничего не возвращает).

Вероятно просто пример неудачный.
Приведите реальный пример, когда эта "реентерабельность" действительно нужна.

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

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 17:43

John Doe wrote:
Skirda wrote:плагин может по той же методе "подсунуть" свою, нужную только ему, последовательность.
Мне не нравится само это "подсовывание".
Я правильно понимаю, что если бы не синхронность callplugin, то достаточно было бы просто поместить нужную последовательность после?
Вероятно я понимаю неправильно, и речь о том что плагин (вызванный посредством callplugin) может захотеть выполнить какие-то свои макросы, а вовсе не те что переданы ему параметром извне.

Но вопрос в силе: насколько реален этот сценарий.

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 8 times

Re: Переименовать callplugin

Post by SUSim » Wed 29 Feb, 2012 17:59

John Doe wrote:Не. Например в данный момент работает "прозрачный" макрос, ждущий закрытия диалога, типа $while(Dialog) ... eval(waitkey()) $exit
Естественно что в это время все прочие клавиатурные макросы не срабатывают.
Неа :) макросы в макросах работают:
надо вместо eval(waitkey())

%VK:=waitkey(); %comment="Что-то нажали";
$IF (eval(%VK,2)==-2) eval(%VK) $END %comment="испольним макрос повешенный на это что-то, а если макроса нет, то просто это что-то нажмем :)";
SimSU ··· ·· -- ··· ··-

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

Re: Переименовать callplugin

Post by Max Rusov » Wed 29 Feb, 2012 18:09

John Doe wrote:Приведите реальный пример, когда эта "реентерабельность" действительно нужна.
IMHO, она нужна всегда, я не понимаю зачем нужен режим. Если она не глючит, то ее просто надо включить по умолчанию - и пользоваться.

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 8 times

Re: Переименовать callplugin

Post by SUSim » Wed 29 Feb, 2012 18:15

Действительно чем диалог плагина вызванного callplugin, а не через F11 должен отличаться поведением? (для макросов)
SimSU ··· ·· -- ··· ··-

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

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 18:23

Max Rusov
Это ж ещё определить надо глючит или нет.
Но да, чтобы определить наверняка - стоит по умолчанию включить.

SUSim
Должен / не должен, но пока отличается (синхронность обязывает).
Max Rusov wrote:IMHO, она нужна всегда
Но что если функцию callplugin сделать асинхронной?
Открыл диалог и свободен, реентерабельность уже не нужна (тут).

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

Re: Переименовать callplugin

Post by Max Rusov » Wed 29 Feb, 2012 18:38

John Doe wrote:Но что если функцию callplugin сделать асинхронной?
Это ортогональные вещи. Синхронный вызов тоже нужен, я же приводил пример. И хочется, чтобы во время синхронного вызова макросы продолжали работать.

Делать ли CallPlugin асинхронным по умолчанию - другой вопрос. Как я понимаю, это просто технически довольно сложно. + сейчас у людей уже довольно много макросов которые могут поломаться, если вдруг поведение CallPlugin изменить. Поэтому я и говорю - оставьте его в покое, пусть работает как есть. Для асинхронного вызова уже сделали (почти) Plugin.Menu - надо его довести до ума и включить в сборку.

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

Re: Переименовать callplugin

Post by Skirda » Wed 29 Feb, 2012 18:41

John Doe wrote:Как-то это неоправданно: вводить целый глобальный режим для внутренних нужд одной единственной функции.
Т.е. mmode(1) тебя не смущает, а mmode(3) напрягает. Странная ситуация.
John Doe wrote:Не логичнее будет нечто вроде спецпараметра callplugin?
Ты готов переписать все макросы, юзающие callplugin?
John Doe wrote:
Skirda wrote:плагин может по той же методе "подсунуть" свою, нужную только ему, последовательность.
Мне не нравится само это "подсовывание".
Если афтор плагина неудосужился описать что делает плагин во время callplugin, то это явно не к нам.
С другой стороны тебя не напрягает "F11 c 2", например?
Откуда уверенность, что плагин "foo" с хоткеем "c" делает все верно в ответ на "2"?
John Doe wrote:Я правильно понимаю, что если бы не синхронность callplugin, то достаточно было бы просто поместить нужную последовательность после?
Типа того, но! Ты уверен, что вызвав callplugin плагин не сделает MSSC_POST?
We are the Borg. You will be assimilated.
So Say We All!

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

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 18:47

Max Rusov wrote:Это ортогональные вещи.
Я как раз подумываю что не совсем.
Max Rusov wrote:Синхронный вызов тоже нужен, я же приводил пример.
Про возвращаемое значение. Разве callplugin сейчас возвращает что-то кроме ошибок?
Не спорю, что синхронный вызов может понадобится тоже, но об этом отдельно.
Max Rusov wrote:сейчас у людей уже довольно много макросов которые могут поломаться
"Могут" это такое, а вот плагины "по факту" регулярно ломаются и ничего, все понимают.

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 8 times

Re: Переименовать callplugin

Post by SUSim » Wed 29 Feb, 2012 18:50

Я говорил, про то - что диалог появившийся посредством F11 макросом както можно учесть, а вот если диалог вдруг возник после calplugin макросом обработать невозможно :(
А по большому счету такое поведение при появлении диалогов,запросов и т.п. для макросов хорошо бы разделить:
1) появился диалог-запрс (не важно чей самого фара или макроса) - выполнять макрос дальше.
2) появился диалог-запрс (не важно чей самого фара или макроса) - приостановить макрос обрабатывать действия пользователя, потом продолжить макрос. Правда это ИМХО сложно реализовать и тяжело универсально сделать, надо подумать и обсудить в какой момент фар должен приостанавливать макрос в какой продолжать!!! :?
SimSU ··· ·· -- ··· ··-

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

Re: Переименовать callplugin

Post by Skirda » Wed 29 Feb, 2012 18:54

SUSim wrote:Действительно чем диалог плагина вызванного callplugin, а не через F11 должен отличаться поведением? (для макросов)
Технически ничем - т.е. и там и там вызывается одна и та же OpenW. В любом случае появление плагинового диалога - это мы все в той же функции OpenW, пока диалог не закроем и не вернемся из OpenW - мы по прежнему в плагине.

Разница здесь как раз в том, что mmode(3,0) не замораживает текущий макрос (технически: не сохраняется состояние машины и не движку не разрешается ваще работать, пока не вернемся из OpenW, для юзера из callplugin).

С другой стороны mmode(3,1) пушит текущее состояние машины перед вызовом плагина и разрешает последующий вход в макродвиг. НО! Т.к. мы все еще в OpenW (синхронный режим!), то могут исполняться макросы, которые из OpenW ФАРу отдаст плагин. Дальше просто - при выходе из OpenW (читай "из callplugin") машина восстанавливается и продолжается последовательность после callplugin; макропоследовательность, которую плагин кинул ФАРу из OpenW, обрывается (даже если не успела исполнится) (здесь могу наврать :quiet: - посмотреть надо)
We are the Borg. You will be assimilated.
So Say We All!

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

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 18:56

Skirda wrote:Т.е. mmode(1) тебя не смущает, а mmode(3) напрягает.
Ага. (Не)прорисовка экрана она влияет на всё и всех.
Это действительно режим в глобальном смысле.
А mmode(3) влияет только на callplugin, как эдакий внешний её параметр.
Странная ситуация.
Skirda wrote:Ты готов переписать все макросы, юзающие callplugin?
Одним регэкспом.

И цитирую Писание:
http://api.farmanager.com/ru2/macro/macrocmd/prop_func/general.html#callplugin wrote:Внимание!

Функция - экспериментальный прототип планируемого функционала по взаимодействию макросов и плагинов. Вы используете ее на свой страх и риск. Поддержка функционала со стороны разработчиков не гарантирована. После появления необходимого фунцкионала callplugin будет удалена.
Skirda wrote:Ты уверен, что вызвав callplugin плагин не сделает MSSC_POST?
При этом что конкретно произойдёт? Его макрос добавится в конец очереди, и будет выполнен последним?
Чем это будет отличаться от варианта когда плагин вызван по F11?

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

Re: Переименовать callplugin

Post by Max Rusov » Wed 29 Feb, 2012 19:00

John Doe wrote:
Max Rusov wrote:сейчас у людей уже довольно много макросов которые могут поломаться
"Могут" это такое, а вот плагины "по факту" регулярно ломаются и ничего, все понимают.
Ну вот такой пример: EdtFind умеет вот такие макросы:

CallPlugin(EdtFind, "Find:foo Replace:bar Prompt:1")

Ожидается, что CallPlugin вернет управление, когда все замены будут выполнены. Если он вдруг станет асинхронным - то ситуация изменится: макрос "побежит" дальше как только выскочит диалог подтверждения замены, что мне в данном случае совершенно не хочется.

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

Re: Переименовать callplugin

Post by Skirda » Wed 29 Feb, 2012 19:03

На счет синхронно/асинхронно.
Говоря/предлагая/фантазируя про синхронно-асинхронность учитывайте тот факт, что макродвиг вызывается из функции сбора входных консольных эвентов. Т.е., если плагин ни разу не передал управление ФАРу из функции OpenW (например, для редакторных плагинов - ни разу не вызвал ECTL_READINPUT), нихрена вы не получите (hint: ищите в сорцах места вызова GetInputRecord()), точнее получите все тот же синхронный режим.
We are the Borg. You will be assimilated.
So Say We All!

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

Re: Переименовать callplugin

Post by John Doe » Wed 29 Feb, 2012 19:09

Max Rusov wrote:CallPlugin(EdtFind, "Find:foo Replace:bar Prompt:1")
Ну а как мы до этого жили?
Макросом заполняли диалог, и макросом же жали Enter/Ok. Чем ваш вариант отличается?
Тем что может выскочить подтверждение? Там мы его умеем макросом обрабатывать.

...
Согласен что синхронные функции полезны для таких сложных случаев.
Но таких случаев будет заведомо меньше, вы не считаете?

Я всё клоню к тому, что по умолчанию асинхронность удобнее, поскольку банально нужна в 95%
Синхронность тоже нужна, но не по умолчанию.
...получите все тот же синхронный режим.
Если плагин не вызвал ECTL_READINPUT то вероятно его синхронность нам и не помешает.

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

Re: Переименовать callplugin

Post by Skirda » Wed 29 Feb, 2012 19:14

John Doe wrote:(Не)прорисовка экрана она влияет на всё и всех.
Это действительно режим в глобальном смысле.
А mmode(3) влияет только на callplugin, как эдакий внешний её параметр.
Добавь сюда зоопарк плагинов, вызываемых через callplugin, и получишь ровно столько.
John Doe wrote:
Skirda wrote:Ты готов переписать все макросы, юзающие callplugin?
Одним регэкспом.
На свой комп не пущу :-)
John Doe wrote:И цитирую Писание
Это мне в целях напоминания было представлено?
Я хозяин своих слов - посему могу эти слова из писания забрать обратно :ha:
А могу удалить callplugin в пользу чего-то более вменяемого.
Все зависит от того, как дальше попрет.
John Doe wrote:
Skirda wrote:Ты уверен, что вызвав callplugin плагин не сделает MSSC_POST?
При этом что конкретно произойдёт? Его макрос добавится в конец очереди, и будет выполнен последним?
Чем это будет отличаться от варианта когда плагин вызван по F11?
mmode(3,0) - добавит в конец
mmode(3,1) - исполнит...
...я это выше объяснил :x

ЗЫ.
В пользу доп.параметра (подразумеваю, что его хотя видеть первым) callplugin пока не услышал вменяемых доводов.
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: 10 times

Re: Переименовать callplugin

Post by Max Rusov » Wed 29 Feb, 2012 19:15

John Doe wrote:Я всё клоню к тому, что по умолчанию асинхронность удобнее, поскольку банально нужна в 95%
Синхронность тоже нужна, но не по умолчанию.
Ну так самое очевидное решение - добавить новый вызов, который будет асинхронным. Все счастливы.

Locked

Return to “Обсуждение макросов”