MacroEx — запуск макросов нетрадиционными способами

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe »

Есть полезнейшая возможность в MacroLib — запуск макросов удержанием, двойным нажатием, и др.
Хорошо бы подобное и в родные макросы (тикет на мантисе есть).

А пока попробуем приблизится к решению задачи имеющимися средствами.

Предлагаю скрипт MacroEx, расширяющий возможности запуска макросов следующим образом:
  1. В имени клавиши через двоеточие теперь можно указывать дополнительные модификаторы Hold и Double:
    • key:Double — макрос будет выполнен при двукратном нажатии клавиши (в течении 300 мс, не отпуская клавиши-модификаторы)
    • key:Hold — макрос будет выполнен при удержании (>300 мс)
      Пример:
  2. Поддерживаются последовательности из двух нажатий, перечисленные через "-":
    • key-key2 — макрос будет выполнен при нажатии последовательности клавиш.
      Последовательность следует нажимать так: .
      Если вторая клавиша последовательности в течении секунды не будет нажата, то появится подсказка: из описаний возможных макросов.
      Пример:
    На один и тот же key можно назначить произвольное число макросов, конфликты разрешаются по правилам, принятым в LuaMacro.
    Макросы с модификаторами не лишают указанную комбинацию исходного значения: короткое нажатие выполнит исходное действие (или макрос, если назначен).
Ограничения:
  • В качестве key поддерживаются только комбинации клавиш с модификаторами Ctrl/Alt/Shift.
Установка: достаточно расположить прилагаемый macroEx.lua где-либо в scripts.
Attachments
MacroEx-3.2.1.7z
(4.9 KiB) Downloaded 69 times
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

Latest post of the previous page:

John Doe wrote: Fri 25 Jun, 2021 12:03Одинарные нажатия.
не могли бы вы привести примеры того использования, как простые и посложнее?
перечитал всю тему, не нашел примеров для этого случая использования
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe »

citRiks wrote: Fri 25 Jun, 2021 16:01 не могли бы вы привести примеры того использования, как простые и посложнее?
Если б я ещё помнил..
Наверно типа CtrlAlt, СtrlShift.

Сейчас они работают и без tryComboMod, но раньше было не так: когда-то far.NameToInputRecord("CtrlShift") возвращало nil (хотя и сейчас не всё гладко).
Вполне вероятно что tryComboMod это пережиток, но чтобы сказать наверняка надо разбираться.

История вопроса по ссылке https://bugs.farmanager.com/view.php?id=2857
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

понятно, и подтверждаю что вышеупомянутые Ctrl+Shift, LAlt+Ralt работают сейчас в нормальном режиме:

Code: Select all

Macro { description = "test",
	area = "Editor",
	key = "RCtrlLAlt LCtrlRAlt LCtrlShift",
	action = function() far.Message("plain macro\n"..mf.akey(1, 0), mf.akey(1, 1)) end
}
в моей версии MacroEx разное вычурное такое тоже работает без tryComboMod:

Code: Select all

	"LCtrlAlt-RCtrlAlt",
	"CtrlRAlt-LCtrlRAlt-F8",
	"CtrlAlt:Hold",
	"CtrlRAlt:Hold-F3-F2-F1",
	"RCtrlRAlt:Double",
	"RCtrlAlt-Alt",
	"LCtrlRAlt-Alt",
	"LCtrlRAlt-F7-F6-F5",
	"LCtrlLAlt-F3-F3-F3 LCtrlLAlt:Double-F4-F4-F4-F4",
Last edited by citRiks on Sat 26 Jun, 2021 16:32, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

John Doe wrote: Sun 18 Jul, 2021 17:15В таком случае при наличии КтрлФ9 более длинная комбинация никогда не сработает?
и правильно сделает что более длинная не сработает, на то она и более длинная.
иначе она будет перехватывать у короткой то что как минимум не всегда нужно перехватывать
Вот сами подумайте, есть короткая последовательность ShiftF8, и раз она есть, то очевидно что она нужна.
И вот еще есть более длинная "ShiftF8-F9" скажем, в редакторе для примера.
Это штатная кнопочка для смены кодировки файла.
почему вообще "ShiftF8-F9" должен перехавтывать "ShiftF8"?
иными словами, почему ShiftF8 должно обрабатываться ТОЛьКО при неудаче "ShiftF8-F9"?
Во-вторых, на практике ShiftF8 работает через раз нестабильно при незавершенной "ShiftF8-F9".
(на Far 3.0.5836.0 x86)
Как воспроизвести:
  • Нажимаем ShiftF8 и держим Икс секунд
  • Отпускаем ShiftF8, тренькнуло бипом
  • Меню кодировок файла в редакторе так и НЕ ПОЯВИЛОСь
Если же нажать ШифтФ8 быстро не держа, то меню кодировок да, появится.
Но это по-моему какай-то сумятица с пользовательской точки зрения
Т.е., чуть недодержал или передержал, и произошло совсем не то что имелось ввиду.
вплоть до смены кодировки файла :)
И давайте будем помнить про то что бывают condition функции для всех макросов, и с sequences тоже, что тоже будет пpивносить сумятицу.

возвращаясь к логичной обоснованности приоритета коротких над длинными
  • Они короче, значит вызываются первыми, мне это логично во всех контекстах
  • если они не вызаваются, то пожалуйста, пусть работает более длинная
  • если короткая и продолженная комбинация должны быть независимы,
    то надо их (пере)назначить так чтобы не конфликтовали,
    что однако не отменяет логичное правила "более короткое - более первое"
Last edited by citRiks on Sun 18 Jul, 2021 18:09, edited 2 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

@John Doe в любом случае, У ВАС, ввиду только лишь двух последовательностей/расширений кнопочек,
обозначенная проблема менее актуальна чем у меня в потенциале со множественными кнопочками.
главный прынцып - проверять condition у множественных, и если condition не выполняется, то и не возбуждаться,
дожидаясь само-отмены макроса или отменяя его каким-нибудь неочевидным способом.
ваш MacroEx для своего минимализма очень гениальный, продуманный, и нужный.
я же отгрохал супер-комбайн на этой основе, но не факт даже что сам буду пользоваться :)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe »

citRiks wrote: Sun 18 Jul, 2021 18:01 почему вообще "ShiftF8-F9" должен перехавтывать "ShiftF8"?
Он и не перехватывает, можно использовать обе.
citRiks wrote: Sun 18 Jul, 2021 18:01 тренькнуло бипом
Меню кодировок файла в редакторе так и НЕ ПОЯВИЛОСь
Именно потому и не появилось, что передержали. Сделано намеренно.
Сценарий: удерживаем Shift-F8 долго, до появления меню (потому что забыли комбинацию). И оказалось что в меню её тоже нет, например потому что ошиблись со стартовой кнопкой. Очевидно что и меню кодировок в этой ситуации нам не нужно.
А если нужно, то мы просто нажмём Shift-F8, и отпустим не дожидаясь бипа (который и сигнализирует о том что передержали).
Значение задержки настраивается.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

John Doe wrote: Mon 19 Jul, 2021 09:27Именно потому и не появилось, что передержали. Сделано намеренно.
а теперь сделайте break_sequence_on_mod_release = false и попробуйте получить меню кодировки через ShiftF8,
это не получится никак уже. потому что ShiftF8-F9 перехватывает.
и тогда когда по conditioning ShiftF8-F9 вообще не должно срабатывать, то тоже перехватывает.
И зачем видеть в подсказке ShiftF8-F9 когда он не сработает, т.е. когда его не должно быть в подсказке?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe »

citRiks wrote: Mon 19 Jul, 2021 14:27 это не получится никак уже.
Ну так не надо стрелять себе в ногу.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

John Doe wrote: Mon 19 Jul, 2021 16:22Ну так не надо стрелять себе в ногу.
согласен :) у меня немного другие представления о технике безопасности правда,
мне кажется что тут у нас происходит провокация пользователей стрелять себе в ногу.
чего, как мне кажется, было бы легко избежать просто давая приоритет обычным одинарным кнопочкам,
(просто так то что было, чтобы продолжит работать так же и далее).
и в моем варианте, двойными кнопочкам давая приоритет перед тройными,
тройным перед четверными, итд.

ДИСКЛАЙМЕР
О вкусах фломастеров не спорят, но похоже мы именно это и делаем.
Кроме того, любой нормальный девелопмент это искусство возможного
(а не перфекционизм отдельных личностей вроде меня)
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

MacroEx — запуск макросов нетрадиционными способами

Post by citRiks »

@John Doe, я тут только что осознал что у нас у всех есть проблема с кнопочками типа где есть и левый и правый Алт/Ктл одновременно
  • CtrlRCtrlAltRAlt
    это должно быть корректно, и например lua:le(far.NameToInputRecord("CtrlRCtrlRAltAlt")) правильно дает 15 (1 + 2 + 4 + 8 )
    Но в обычных макросах это не сработает, ну и в наших тоже.
  • CtrlRCtrlAltRAltА
    lua:le(far.NameToInputRecord("CtrlRCtrlAltRAltА")) правильно дает 15 (1 + 2 + 4 + 8 ) и букву А.
    Но в обычных макросах это сработает как RCtrlAltRaltA, что неправильно
waitkey тоже понимает CtrlRCtrlAltRAlt<любая буква> как RCtrlAltRAlt<любая буква> что неправильно.
но зато waitkey правильно понимает RCtrlAltRalt, а "простые" макросы уже не переваривают и это.
И это значит что в MacroEx можно решить задачу с таким типом, хоть и без второго (левого) Контрола.

PS
хотя не, не все так просто, вайтекй начинает дурить когда замешаны одновременно более двух Альт+Ктрл.
<четыре Альт+Ктрл>БУКВА waitkey превращает всегда в RctrlRAlt<БУКВА>.
<четыре Альт+Ктрл> waitkey превращает в непонятно что из <три Алт+Ктрл>,
AltRAltRCtrl waitkey превращает в RCtrlRAlt,
но видимо в зависиомости от того что из четрех этих кнопочек было HAжато ПЕРВЫМ,
а не, что было бы логиченее, OTжато первым.
не, не улавливаю логику

PS 2
ФСЕ СЛОЖНА
где-то я неправильно передаю эти превращения наверное,
но тем не менее это в любом случае неправильно что превращается.
far.NameToInputRecord() ведет себя при этом адекватно, а NameToInputRecord - не адекватно, бяда.
это получается в итоге просто буква А:
lua:le(far.InputRecordToName(far.NameToInputRecord("CtrlRCtrlAltRAltA")))

PS 3
ну в общем сюда похоже лучше не лезть, это я для общего сведения.
Нe самый важный баг, особенно с учетом что есть sequences/extensions, других кнопочек должно хватать
Last edited by citRiks on Wed 21 Jul, 2021 20:43, edited 5 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

MacroEx — запуск макросов нетрадиционными способами

Post by John Doe »

v3.2.1
Небольшой фикс, решающий проблемы типа этих:
https://t.me/FarManager — Telegram чат
Дмитрий Журко
Posts: 81
Joined: Tue 19 Jan, 2021 21:49
Has thanked: 25 times
Been thanked: 1 time

MacroEx — запуск макросов нетрадиционными способами

Post by Дмитрий Журко »

К моему сожалению, пока не прочёл это обсуждение целиком, но в моём проекте я передумал делать задержку для ожидания второго нажатия клавиши, хотя и написал удовлетворительный скрипт для этого. Смущало, что всё время ожидания действие макро для пользователя не проявляется.
Придумал, что ЛУЧШЕ обработать многократный вызов моего макро:
  1. Сохраняю UpTime первого запуска макро.
  2. Если второй запуск до задержки (у меня аж 800 мс), то это двойное нажатие.
    Важное отличие в том, что макро однократного нажатия уже работает сотни мс.
  3. Если до конца задержки макро запускается третий и более раз -- без последствий. То есть автоповторы поглощаются во время задержки.
    Так делать можно не всегда, разумеется, но мне нравится именно такое не тормознутое поведение. И код проще и предсказуемее.
Last edited by Дмитрий Журко on Mon 29 Jan, 2024 00:17, edited 4 times in total.
Post Reply

Return to “Полезные макросы и скрипты”