Есть полезнейшая возможность в MacroLib — запуск макросов удержанием, двойным нажатием, и др.
Хорошо бы подобное и в родные макросы (тикет на мантисе есть).
А пока попробуем приблизится к решению задачи имеющимися средствами.
Предлагаю скрипт MacroEx, расширяющий возможности запуска макросов следующим образом:
В имени клавиши через двоеточие теперь можно указывать дополнительные модификаторы Hold и Double:
key:Double — макрос будет выполнен при двукратном нажатии клавиши (в течении 300 мс, не отпуская клавиши-модификаторы)
key:Hold — макрос будет выполнен при удержании (>300 мс)
Пример:
Поддерживаются последовательности из двух нажатий, перечисленные через "-":
key-key2 — макрос будет выполнен при нажатии последовательности клавиш.
Последовательность следует нажимать так:
— нажать первую клавишу (с модификатором)
— сразу отпустить саму клавишу, но продолжать удерживать модификатор
— нажать вторую клавишу и отпустить вместе с модификатором
.
Если вторая клавиша последовательности в течении секунды не будет нажата, то появится подсказка: из описаний возможных макросов. Пример:
На один и тот же key можно назначить произвольное число макросов, конфликты разрешаются по правилам, принятым в LuaMacro.
Макросы с модификаторами не лишают указанную комбинацию исходного значения: короткое нажатие выполнит исходное действие (или макрос, если назначен).
Ограничения:
В качестве key поддерживаются только комбинации клавиш с модификаторами Ctrl/Alt/Shift.
Установка: достаточно расположить прилагаемый macroEx.lua где-либо в scripts.
hold =function(str)...end;-- function (опциональное поле)
doubletap =function(str)...end;-- function (опциональное поле)
delay =300;-- number (опциональное поле)
}
hold — функция, выполняемая при удержании. doubletap — функция, выполняемая при двукратном нажатии.
Если ни одно из двух полей не задано, то будет определён самый обычный макрос, без особой обработки.
delay — временной интервал, в течении которого необходимо удерживать клавишу, или в течении которого должны произойти два нажатия.
Если не указан, то используются умолчания, заданные в коде модуля.
Если в течении указанного интервала не будет зафиксировано ни удержания, ни двойного нажатия, то будет выполнена стандартная функция action.
Если она не задана, то исходное нажатие клавиш будет передано фару (если на это сочетание существует макрос — он будет выполнен).
Примечания:
hold/doubletap-макросы имеют приоритет перед обычными, что позволяет им более-менее прозрачно сосуществовать.
Распознаётся удержание модификатора (Ctrl/Alt), а не самой клавиши.
К этому надо приноровиться, ведь чтобы нажатие сработало как одиночное — необходимо вовремя отпустить модификатор.
Не идеальное решение, но других идей у меня пока нет (если вообще подобное возможно без специальной поддержки в фаре).
В текущей версии для определения двойного нажатия тоже требуется комбинация с модификатором (это требование в принципе можно убрать).
Определённые таким образом макросы отображаются в макробраузере, но оттуда не получится открыть файлы, в которых они определены (в принципе поправимо).
Новая функция: запуск макросов последовательностью нажатий.
Не так давно обсуждалось в теме MacroLib.
Хотя сама идея далеко не нова, на форуме обсуждалось и раньше, а на мантисе об этом из самых первых тикетов.
Сейчас встроенные средства LuaMacro уже позволяют легко достичь похожей функциональности, используя меню конфликта макросов.
Однако такой подход накладывает ряд ограничений:
Позволяет использовать только символьные хоткеи.
Невозможно использовать функциональные, курсорные, служебные клавиши.
Невозможно использовать клавиши с модификаторами
Например, чтобы набрать проследовательность Ctrl-K-K необходимо отпустить модификатор после первого K.
Меню нельзя просто закрыть нажав неназначенную клавишу.
Надо или сделать выбор, или использовать Esc/F10 для закрытия меню.
Вероятно это не более чем вопрос привычки (как и предыдущий пункт), но зачем себя насиловать, если можно сделать удобнее?
Представляю реализацию запуска макросов последовательностью нажатий без использования меню.
Особенность: функция первой клавиши, активирующей начало последовательности, не теряется!
Это важно, поскольку в фаре не так много свободных сочетаний.
Работает так: последовательность ожидается только до тех пор, пока удерживается модификатор.
Если же отпустить модификатор, то будет задействована штатная функция клавиши (или даже другой макрос, если назначен).
Следует учитывать, что такой подход накладывает свои ограничения:
требуется удерживать модификатор всё время набора последовательности, что не всем привычно
то что выполнение штатного действия начинается по отпусканию, а не по нажатию, в некоторых случаях может быть существенно (например так невозможно организовать автоповтор).
status="^K: Операции с блоками [BKHCV]";-- string (опциональное поле)
B=function(key)......end;-- function \
C="CtrlP";-- string \
...-- } (произвольное число полей)
X={......};-- table /
...-- /
}
Поле status — текстовая подсказка, выводимая в первой строке.
Таблица может содержать произвольное число полей, имена которых представляют собой названия клавиш.
Значения полей могут быть:
— функциями (как action)
— строками (выполняются через eval/Keys).
— таблицами (экспериментально). Таблица воспринимается как вложенная последовательность (так можно строить последовательности произвольной длины).
Новая функция: таблица sequence может содержать поле help.
В этом случае, если в течении секунды не будет нажата следующая клавиша последовательности, то на экран будет выведено сообщение с текстом, заданным в help.
MacroEx больше не является модулем, его не требуется как-то подключать, для использования достаточно поместить в папку scripts.
Больше нет никакого особого синтаксиса, вместо этого аналогично MacroLib в самом имени клавиши можно указать через двоеточие "модификаторы" Hold или Double, или вторую клавишу последовательности.
Max Rusov wrote:Синтаксис key:key2 кажется не очень удачным. Может лучше: key+key2+... ?
Да, пожалуй...
Что касается второго "+", то на данный момент не поддерживаются последовательности длиннее 2х нажатий.
И не уверен что это может быть полезно.
Wave wrote:А в зачем было переделывать с модуля на скрипт?
Модуль или нет — не принципиально, а важно другое: теперь каждое определение никак не зависит от остальных.
Это значит что отдельные макросы не обязаны быть собраны в одном общем определении, а могут быть как угодно разбиты по файлам.
И это отнюдь не мелочи, ведь теперь в одном файле легко собрать макросы c разными хоткеями, использующие общие переменные/функции.
Плюс, такая система гибче, поскольку каждый макрос может иметь собственные условия срабатывания (flags,mask,priority,condition).
P.S.
turbo пока работает со старым модулем. Обновление выложу когда будет готово.