MacroLib — Far Macro Library

Здесь можно обсудить ваш любимый плагин.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

Latest post of the previous page:

Вроде, "съедаются" до отпускания.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: Еще, кстати, есть "Release" и "Up"
А что за Up?
В документации не вижу.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

- Новые модификаторы нажатий - Down и Up:

Down - Макрос срабатывает только при нажатии (без автоповтора)
Up - Макрос срабатывает при отпускании. В отличии от Release
макрос срабатывает при отпускании префиксных клавиш, даже
если были комбинированные нажатия
Мне это было нужно для макросов, которые срабатывают при отпускании префиксной клавиши после набора текста, типа ShellBookmark/PanelFilter. Возможно, в LUA это можно сделать иначе и эти модификаторы уже лишние...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Post by John Doe »

Иначе можно, например запуская в момент нажатия отдельный поток, который будет по таймеру опрашивать состояние клавиши.
Или же можно (в корне изменив подход) объединить все в одном цикле, в конце которого проверять состояние клавиши-модификатора.

Но я хочу поговорить совсем о другом: что если научить макролиб запускать обычные макросы luamacro?
Ну не совсем обычные, а с модификаторами (Hold, Double, Release, Up, Down,…), а обычные в том плане, что загружаться они будут наряду с прочими штатным образом, а функция макролиб будет состоять только в их запуске.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

Я особо не думал на эту тему. LUA принес много возможностей, и я их, наверное, не все осознаю. Что Вы имеете ввиду:
- Оставить в FML файлах только привязку кнопок а макросы описывать в LUA и вызывать по именам/GUID'ам?...
- Изменить формат FML на "чистый" LUA и как то интегрировать с LuaMacro?
- Что-то еще?...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Изменять ничего не предлагаю.
Предлагаю добавить новую возможность:

LuaMacro загружая макросы не интересуется насколько назначенные сочетания "корректны", поэтому можно использовать клавиши вроде Key:Hold, Key:Double, и т.д. Но конечно сами по себе такие макросы не запустятся, поэтому и нужен макролиб.

Макролиб может запускать такие макросы как свои родные, через MCTL_EXECSTRING MCTL_SENDSTRING, но передавать не полный текст макроса, а return eval("Keys:Hold",2).

Насколько я могу судить, реализовать это не сложно.
Для работы понадобиться полный список назначенных сочетаний, его легко получить с помощью mf.GetMacroCopy.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

Я подумаю на над этим. На первый взгляд это должно быть несложно. Правда MacroLib сейчас не умеет проверять произвольный Condition, и я не уверен, что это можно сделать, хотя там что-то добавлялось в API, надо посмотреть.

Другой вопрос: возможно стоит назначать макросу "расширенные" кнопки через другое свойство, например, KeyEx="Key:Hold" ?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: Правда MacroLib сейчас не умеет проверять произвольный Condition
А зачем? Luamacro это сделает самостоятельно (и это большой плюс, имхо).
Max Rusov wrote: назначать макросу "расширенные" кнопки через другое свойство, например, KeyEx="Key:Hold" ?
Для чего?
И luamacro сейчас не хранит нестандартные свойства.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

John Doe wrote:
Max Rusov wrote: Правда MacroLib сейчас не умеет проверять произвольный Condition
А зачем? Luamacro это сделает самостоятельно (и это большой плюс, имхо).
Так не получится. MаcroLib должен знать запуститься макрос или нет. Если Condition возвращает False, то нажатие не должно "съедаться".
John Doe wrote:
Max Rusov wrote: назначать макросу "расширенные" кнопки через другое свойство, например, KeyEx="Key:Hold" ?
Для чего?
Чтобы MacroLib не начал сразу перехватывать все имеющиеся у пользователя макросы, потому что при этом 100% что нибудь сломается. Например, MacroLib по другому интерпретирует регулярные выражения.
John Doe wrote:И luamacro сейчас не хранит нестандартные свойства.
Фигово :(

Upd: Хотя, можно в key запихнуть какой-нибудь признак, чтобы MacroLib определял "свои" макросы. Типа key="#Key:Hold "
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: Если Condition возвращает False, то нажатие не должно "съедаться".
Нажатие должно съедаться если eval вернул 0.
Max Rusov wrote: Чтобы MacroLib не начал сразу перехватывать все имеющиеся у пользователя макросы
Так макролиб может легко узнать "свои" макросы и по key.
FML-регэкспы тоже можно как-то задавать в key (хотя мне они пока не понадобились на практике с модификаторами Hold/Double/...)
Max Rusov wrote:Фигово
Решаемо. В любом случае это не препятствие.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: Upd: Хотя, можно в key запихнуть какой-нибудь признак, чтобы MacroLib определял "свои" макросы. Типа key="#Key:Hold "
Двоеточие в середине это и есть определяющий признак, даже без #

MacroEx у меня именно так и работает, это не фантазии, а опробованный подход.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

John Doe wrote: Нажатие должно съедаться если eval вернул 0.
Нет, так не получится. Например, привязка Key:Release должно "съедать" _нажатие_ Key, еще до того как придет отпускание. Т.е. знать заранее, будет ли макрос исполнен.

И сомневаюсь, что получится вызов через eval, в случае если назначено > 1 кнопки или регулярное выражение. И с AKey проблемы будут. Вообщем, не так все просто...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: привязка Key:Release должно "съедать" _нажатие_ Key, еще до того как придет отпускание
Даже так, вместо клавиши можно отправить макрос (Keys).

Если я правильно понял, то проблема в том, что получив отпускание нельзя будет отправить фару сразу 2 события.
Может быть стоит доработать ProcessConsoleInputW?
Max Rusov wrote: сомневаюсь, что получится вызов через eval, в случае если назначено > 1 кнопки или регулярное выражение
Не сомневайтесь. Проверено, работает Хотя может и не так, как вам требуется, т.к. при конфликте выводится меню, а eval возвращает управление только после исполнения макроса.

Что касается регулярных выражений (если они вообще нужны), то есть только одна проблема: синтаксис eval. Решаемо.
Max Rusov wrote: И с AKey проблемы будут.
Keys"AKey"?
А по задумке оно должно выполнять клавишу без модификатора?
Не уверен в необходимости, но можно решить, возвращая из макроса значение. (для Luamacro я тоже предлагал использовать это вместо AKey)
Max Rusov wrote: Вообщем, не так все просто...
Есть же готовое, работающее решение в виде MacroEx.
MacroEx конечно работает иначе, но всё можно решить доработкой фара.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

Есть макрос:

Code: Select all

Macro 
{ 
  description="test1"; area="Editor"; key="AltX:Hold AltY:Hold"; 
  action=function()
    far.Message( 'Key: ' .. mf.akey() .. " - " .. mf.akey(2) );
  end;
}
Как его вызвать, чтобы mf.akey вернула AltX или AltY ?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroLib — Far Macro Library

Post by John Doe »

Max Rusov wrote: Как его вызвать, чтобы mf.akey вернула AltX или AltY ?
mf.eval("AltX:Hold",2)
akey(1,1) вернёт "AltX:Hold" либо "AltY:Hold", и я не знаю чего ещё желать.
John Doe wrote: при конфликте выводится меню, а eval возвращает управление только после исполнения макроса.
Собственно плагин может и не ждать завершения eval.

Вместо этого плагин может перевызывать себя из макроса, т.е. постить что-то типа

Code: Select all

local key,op_id = ...
local ret = eval(key,2)
Plugin.Call(macrolib,ret,op_id)
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

MacroLib — Far Macro Library

Post by Max Rusov »

John Doe wrote: akey(1,1) вернёт "AltX:Hold" либо "AltY:Hold", и я не знаю чего ещё желать.
Может я туплю, но у меня не получается. Возвращает только реально нажатую кнопку - AltZ. ЧЯДНТ?

Code: Select all

Macro 
{ 
  description="test1"; area="Editor"; key="AltX:Hold AltY:Hold"; 

  action=function()
    far.Message( 'Key: ' .. akey(2) .. " - " .. akey(1,1));
  end;
}


Macro 
{ 
  description="test"; area="Editor"; key="AltZ";

  action=function()
    eval("AltX:Hold",2)
    mf.beep(0x10)
  end;
}
Post Reply

Return to “Обсуждение плагинов”