Запуск макросов двойной комбинацией клавиш

Здесь обсуждается всё, что касается макросов.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

Данный скрипт предназначен для обработки групп макросов, которым назначена двойная комбинация клавиш с повторяющейся первой, например key="CtrlK", key2="CtrlX"; key="CtrlK", key2="CtrlC"; key="CtrlK", key2="CtrV". Для этого добавляется обработка двух дополнительных полей в определении Macro:
  • key2 (основное) - вторичная клавиатурная комбинация, работающая в меню выбора макроса;
  • bdsize (дополнительное) длина, отводимая под базовую часть описания.
Предыстория здесь.
Attachments
key2Process.1.1.0.7z
(2.94 KiB) Downloaded 113 times
Last edited by IgorZ on Tue 11 May, 2021 10:39, edited 2 times in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

В связи с тем, что модуль устоялся и востребован, а также, использовав как повод просьбу избавиться от необходимости использовать _macroinit.lua, выпускаю релиз.

Из нововведений: упрощён способ использования, добавлена возможность неоднократного вызова, что позволяет вместо однократного вызова из _macroinit.lua вставлять вызов в каждый файл с макросами, использующими поле key2. Второе нововведение протестировано, но полной гарантии, что это ни при каких условиях не приведёт к зацикливанию, дать не могу. Как показывает практика, всегда найдётся пользователь, который изобретёт способ сломать программу, до которого не додумался автор.
User avatar
Konstantin
Posts: 234
Joined: Wed 14 Jun, 2006 19:29
Location: Санкт-Петербург
Has thanked: 109 times
Been thanked: 5 times

Запуск макросов двойной комбинацией клавиш

Post by Konstantin »

IgorZ,

Практика показала, что вызов модуля достаточно вставить перед любым одним из макросов. И после активации данного макроса модуль действует в отношении всех остальных макросов со вторичными ключами.

Из этого факта логически следовало, что, вероятно, для полноценной активации модуля его вызов целесообразно поместить перед любым из имеющихся макросов, авто-стартующих при загрузке Фара. И опыт это подтверждает.

Ещё раз выражаю Вам благодарность за создание великолепного модуля key2Process.lua, обеспечивающего более высокую комфортность применения lua-макросов!
«Раньше я думал, что чудаки это те, кто делают странные вещи. Теперь я знаю, что это те, кто называют других странными.» (П. Маккартни)
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Запуск макросов двойной комбинацией клавиш

Post by buniak_a_h »

Konstantin, насколько я понимаю идеологию загрузки макросов, для выполнения того, что имеется в модуле, надо поместить require в любой lua-файл из папок %FARPROFILE%\Macros\scripts. Т.е. не обязательно в макрофайл, содержащий автостартующий макрос; главное - вне функций.
Макрофайлы все выполняются при загрузке макросов. Просто надо различать выполнение самого макрофайла (инициализация переменных, регистрация макросов) и выполнение самого макроса (функции из поля action таблицы-описания макроса). Т.е. то, что в макрофайле находится вне функций выполняется при загрузке макросов.
А _macroinit.lua нужен в том случае, если нужно выполнить нечто гарантированно раньше, чем выполнятся другие макрофайлы.
Это - я так понимаю. Возможно, я и неправ.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

Konstantin wrote: Sun 04 Apr, 2021 12:01 IgorZ,
Практика показала, что вызов модуля достаточно вставить перед любым одним из макросов. И после активации данного макроса модуль действует в отношении всех остальных макросов со вторичными ключами.
Поясню. Во-первых, я не предлагал вставлять require("key2Process") перед каждым макросом. Говорилось только о каждом файле, в котором есть макросы с key2. Во-вторых, допустим, у Вас есть два файла: в c.lua находится группа макросов на CtrlK, в a.lua - на AltC. Вы вставляете require("key2Process") в c.lua. И теперь, когда LuaMacro читает файлы для загрузки макросов, то если он прочитает вначале c.lua, а потом a.lua, то всё будет в порядке. А если наоборот, вначале a.lua, а потом c.lua, то макросы из a.lua не подхватятся модулем key2Process. А поскольку LuaMacro не гарантирует порядок чтения файлов с макросами, то для избежания вышеописанной ситуации надо вызывать модуль или из каждого файла, в котором есть макросы с key2, или из того файла, который читается заведомо раньше всех других (а это только _macroinit.lua).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Запуск макросов двойной комбинацией клавиш

Post by John Doe »

IgorZ wrote: Fri 02 Apr, 2021 10:17 использовав как повод просьбу избавиться от необходимости использовать _macroinit.lua
В идеале было бы в этом случае не подменять AddRegularMacro.
https://t.me/FarManager — Telegram чат
User avatar
Konstantin
Posts: 234
Joined: Wed 14 Jun, 2006 19:29
Location: Санкт-Петербург
Has thanked: 109 times
Been thanked: 5 times

Запуск макросов двойной комбинацией клавиш

Post by Konstantin »

IgorZ,
IgorZ wrote: Wed 07 Apr, 2021 11:05 я не предлагал вставлять require("key2Process") перед каждым макросом. Говорилось только о каждом файле, в котором есть макросы с key2
Это я не чётко выразился. Прошу прощения. Уважаемый buniak_a_h сделал это намного лучше:
buniak_a_h wrote: Sun 04 Apr, 2021 20:18для выполнения того, что имеется в модуле, надо поместить require в любой lua-файл из папок %FARPROFILE%\Macros\scripts ... главное - вне функций
IgorZ wrote: Wed 07 Apr, 2021 11:05поскольку LuaMacro не гарантирует порядок чтения файлов с макросами, то для избежания вышеописанной ситуации надо вызывать модуль или из каждого файла, в котором есть макросы с key2, или из того файла, который читается заведомо раньше всех других (а это только _macroinit.lua)
К большому сожалению, я почти совсем ничего не понимаю в теории, а моя субъективная практика чуток разошлась с вышеизложенным. Вот я и описал её для информации, и для того, чтобы убедиться, что так делать как я сделал не возбраняется и что моя самодеятельность ничего не портит.

Для пущей ясности повторю то, что я делаю. Причём, с вынужденным уточнением.

_macroinit.lua я не использовал, но у меня издавна был макрос, применяемый с флагом flags="RunAfterFARStart"; и мне вполне удобно вставить в самое начало файла с этим макросом вызов сабжевого модуля: require("key2Process").

Однако через некоторое время, уже после того, как я поместил в данной теме свой пост, я обратил внимание на то, что при таком подходе модуль key2Process не всегда срабатывает в макрообласти Editor. И тогда я дополнил исполняемую часть своего автостартующего макроса следующей записью: Keys("ShiftF4") mf.print("C:\\Far3\\Profile\\Macros\\scripts\\сохранитьДанныйФайл(тест).lua") Keys("Enter") far.MacroLoadAll() Keys("F2 Esc"). А в начале файла сохранитьДанныйФайл(тест).lua, как Вы наверняка догадались, помещён вызов сабжевого модуля. После этого действие модуля вроде бы стало распространяться практически на все мои макросы, содержащие поле key2.

Я хорошо понимаю, что мой вышеописанный эксперимент это чистой воды отсебятина. Однако это работает. И по результатам сего опыта теперь уже я ясно вижу, что на практике проще всего поместить вызов модуля в _macroinit.lua.

При этом, с большим почтением, не устану выражать Вам благодарность за превосходный модуль key2Process.lua!
«Раньше я думал, что чудаки это те, кто делают странные вещи. Теперь я знаю, что это те, кто называют других странными.» (П. Маккартни)
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

John Doe wrote: Wed 07 Apr, 2021 11:47
IgorZ wrote: Fri 02 Apr, 2021 10:17 использовав как повод просьбу избавиться от необходимости использовать _macroinit.lua
В идеале было бы в этом случае не подменять AddRegularMacro.
Тогда возможность вызывать единожды из _macroinit.lua исчезает совсем, поскольку функция Macro в utils создаётся заново для каждого загружаемого файла. А эту возможность хотелось бы сохранить.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Запуск макросов двойной комбинацией клавиш

Post by John Doe »

IgorZ wrote: Fri 09 Apr, 2021 06:54 Тогда возможность вызывать единожды из _macroinit.lua исчезает совсем
Почему же исчезает, можно и оставить.
Либо определять что запущена из _macroinit автоматически, либо предусмотреть параметр.
https://t.me/FarManager — Telegram чат
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

John Doe wrote: Fri 09 Apr, 2021 07:17
IgorZ wrote: Fri 09 Apr, 2021 06:54 Тогда возможность вызывать единожды из _macroinit.lua исчезает совсем
Почему же исчезает, можно и оставить.
Либо определять что запущена из _macroinit автоматически, либо предусмотреть параметр.
Технической возможности нет. По крайней мере, я не вижу. LoadMacros в utils для каждого файла со скриптами заново создаёт таблицу окружения, для которой заново создаёт функцию Macro (и остальные). То есть, если мы переопределим Macro в _macroinit.lua, то для следующего файла .lua/.moon сформируется новое окружение с новой функцией Macro (стандартной), а переопределённая сгинет в пучине мусора. А функция AddRegularMacro определяется единожды, соответственно, замена её в _macroinit.lua действует и дальше. И поскольку

Code: Select all

      local env = {
        Macro          = function(t) return not not AddRegularMacro(t,FullPath) end;
-- остальное пропущено для краткости
      }
, где FullPath - имя очередного файла с макросами, то по факту замена AddRegularMacro ничуть не менее корректна и безопасна, чем замена Macro.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Запуск макросов двойной комбинацией клавиш

Post by John Doe »

IgorZ wrote: Wed 14 Apr, 2021 07:01 Технической возможности нет. По крайней мере, я не вижу.
Я вижу так Macro = require "key2process" (Macro): при таком вызове функция возвращается, не переопределяя ничего во внутренностях луамакро. А при вызове require "key2process" () (альтернативно: при вызове из _macroinit) происходит внутреннее переопределение.
IgorZ wrote: Wed 14 Apr, 2021 07:01 по факту замена AddRegularMacro ничуть не менее корректна и безопасна, чем замена Macro.
Тут можно поспорить. Любое вмешательство потенциально опасно, поскольку (1) пользователь как правило не может проверить реализацию, (2) ваш скрипт может не поспеть за изменениями в коде луамакро, (3) и вообще лезть в недокументированные потроха может быть для кого-то например эстетически непреемлимо.
https://t.me/FarManager — Telegram чат
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

John Doe wrote: Wed 14 Apr, 2021 07:32
IgorZ wrote: Wed 14 Apr, 2021 07:01 Технической возможности нет. По крайней мере, я не вижу.
Я вижу так Macro = require "key2process" (Macro): при таком вызове функция возвращается, не переопределяя ничего во внутренностях луамакро.
Нарушается совместимость формата вызова. Однако, нехорошо.
John Doe wrote: Wed 14 Apr, 2021 07:32 А при вызове require "key2process" () (альтернативно: при вызове из _macroinit) происходит внутреннее переопределение.
Ладно, прикину с проверкой на вызов из _macroinit.lua.
John Doe wrote: Wed 14 Apr, 2021 07:32
IgorZ wrote: Wed 14 Apr, 2021 07:01 по факту замена AddRegularMacro ничуть не менее корректна и безопасна, чем замена Macro.
Тут можно поспорить. Любое вмешательство потенциально опасно, поскольку (1) пользователь как правило не может проверить реализацию, (2) ваш скрипт может не поспеть за изменениями в коде луамакро, (3) и вообще лезть в недокументированные потроха может быть для кого-то например эстетически непреемлимо.
  1. Это действует независимо от наличия или отсутствия вмешательства, а только от квалификации пользователя.
  2. В настоящий момент вообще неактуально, к сожалению; когда актуально - ответственность автора скрипта, поддерживать совместимость.
  3. Пользователь этого не видит, если не лезет внутрь; если его так волнует эстетика, пусть не лезет в потроха скрипта. :)
В итоге, всё сводится к вопросу доверия пользователя автору. Надеюсь, я заслужил право расчитывать на такое доверие.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

IgorZ wrote: Fri 16 Apr, 2021 05:34 Ладно, прикину с проверкой на вызов из _macroinit.lua.
В процессе столкнулся с побочным эффектом. Если подменять не AddRegularMacro, а Macro, то у служебного макроса в качестве файла-источника записывается не key2Process.lua, а файл, в котором стоит require: на тот момент файл уже прописан внутри LoadMacros в локальной переменной, которую Macro тупо подставляет в качестве параметра для вызова AddRegularMacro. На первый взгляд - не особо страшно, но где и когда это может выйти боком - предсказать невозможно. Так что не факт, что замена Macro потенциально менее проблемна.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Запуск макросов двойной комбинацией клавиш

Post by IgorZ »

Несмотря на некоторые сомнения, всё же выкладываю итоговый результат своих недавних изысканий.
Версия 1.1.0 -
  • Производится замена Macro, а не AddRegularMacro, если вызов идёт не из _macroinit.lua. То есть, имеем два варианта использования модуля:
    1. Добавляем require("key1Process") в _macroinit.lua. При этом подменяется функция AddRegularMacro. Возможная проблема: автор (Шмуэль) возвращается к разработке LuaMacro, меняет параметры вызова AddRegularMacro, а я этого не отслеживаю и не выкладываю исправленную версию.
    2. Добавляем require("key1Process") в каждый файл, где содержатся макросы с key2. При этом временно подменяется функция Macro в окружении. Потенциальный источник неприятностей: у служебного макроса, необходимого для корректного функционирования дополнительных возможностей, предоставляемых модулем, в служебных данных сохраняется неверное имя файла. Когда и как это выстрелит - не знаю; возможно, никогда и никак.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Запуск макросов двойной комбинацией клавиш

Post by John Doe »

IgorZ wrote: Tue 11 May, 2021 10:59 Добавляем require("key1Process") в каждый файл, где содержатся макросы с key2. При этом временно подменяется функция Macro в окружении.
При этом глядя на (не новые) тенденции развития lua я бы использованию отладочных функций предпочёл бы явную передачу параметров, как-то так:

Code: Select all

local Macro = require"key1Process"(Macro)
(исключительно имхо разумеется)
https://t.me/FarManager — Telegram чат
Post Reply

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