Page 6 of 8

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Sat 15 Dec, 2018 20:36
by sToLp

Latest post of the previous page:

IgorZ,

На текущий момент единственный нюанс, который меня реально беспокоил в результатах работы key2Process.lua, это изъятие подсветки из предустановленных пометок Native: во множестве макросов, в которых содержание полей description начинается конкретно с этих пометок. Такие макросы либо дублируют внутренние команды Far`а, назначенные на соответствующие ключи, либо сообщают о том, что на данный ключ нативная команда не назначена. Они выполняют справочную функцию, являясь при этом вполне дееспособными. И мне очень не хотелось бы терять данную пометку в этих макросах.

Но всё, до чего я додумался, это сдвинуть строку 65

Code: Select all

m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
с тем, чтобы обусловить её выполнение отсутствием наличия в качестве первых двух знаков в самом начале поля description амперсанта & и литеры N, идущих подряд. И вместо одной строки изобразил пять строк:

Code: Select all

  if m.description:sub(0,2)=="&N" then 
    m.description = fmt:format(m.description,modk2,kk2:len()>1 and "" or "",kk2) 
  else 
    m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2) 
  end

И таким образом то, что показано под спойлером [Демонстрация] в предыдущем посте, сохраняет свой вид и с полновесным применением ценных достоинств key2Process.lua в указанных макросах. А этого мне, собственно, и нужно было.

Посмотрите, пожалуйста, насколько это мною сделано корректно в принципе и нельзя ли этого же результата достичь более цивильно?

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Mon 17 Dec, 2018 11:09
by IgorZ
sToLp wrote: Sat 15 Dec, 2018 20:36 IgorZ,

На текущий момент единственный нюанс, который меня реально беспокоил в результатах работы key2Process.lua, это изъятие подсветки из предустановленных пометок Native: во множестве макросов, в которых содержание полей description начинается конкретно с этих пометок. Такие макросы либо дублируют внутренние команды Far`а, назначенные на соответствующие ключи, либо сообщают о том, что на данный ключ нативная команда не назначена. Они выполняют справочную функцию, являясь при этом вполне дееспособными. И мне очень не хотелось бы терять данную пометку в этих макросах.
Вот здесь вопрос неоднозначный, на мой взгляд. Как вообще должен выглядеть такой пункт и на что именно реагировать? Сейчас можно не добавлять key2 к такому пункту, тогда он сохранит базовую быструю клавишу и, заодно, будет явно выделяться на фоне остальных. Можно добавить key2, тогда скрипт внесёт корректировки. А если базовая клавиша, допустим, CtrlV? На какую клавишу должна реагировать команда по умолчанию, что подсвечивать - N или V? А если среди других команд окажется одна с быстрой клавишей CtrlV или CtrlN? В общем, для начала, мне кажется, надо как-то формализовать подход. К примеру, запретить вторичную клавишу, идентичную первичной, для всех макросов, кроме Native. Или в макросе, если нажата повторно первичная клавиша, принудительно запускать пункт Native. В общем, как-то постараться снизить уровень возможного хаоса.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Mon 17 Dec, 2018 17:09
by sToLp
IgorZ wrote: Mon 17 Dec, 2018 11:09 Вот здесь вопрос неоднозначный, на мой взгляд.
...
[вроде бы нужно] как-то постараться снизить уровень возможного хаоса
А вот по моему опыту о возможности хаоса при применении внутренних команд беспокоиться и вовсе не стоит. Т.к. его вероятность в данном случае крайне мала либо совсем не просматривается. А, напротив, просматривается весьма даже простая всего из трёх основных вариантов.
Как вообще должен выглядеть такой пункт ... ?
Для примера можно посмотреть картинки под спойлером [Демонстрация], в одном из моих предыдущих постов.
Сейчас можно не добавлять key2 к такому пункту, тогда он сохранит базовую быструю клавишу и, заодно, будет явно выделяться на фоне остальных.
Нет, это не лучший вариант.
Можно добавить key2, тогда скрипт внесёт корректировки.
Да, лучше добавить key2 по общему правилу. И, вместе с тем, скорректировать корректировку. И если Вы не возражаете против того варварского способа корректировки, который я выше постом, то можно и совсем ничего не менять. А оставить в этом плане так, как есть. А я уже сам поправлю как мне представляется удобным. Тем более, что этот способ вполне меня устраивает, как я уже отмечал это .
А если базовая клавиша, допустим, CtrlV? На какую клавишу должна реагировать команда по умолчанию, что подсвечивать - N или V?
В случаях нативных команд — подсвечивать однозначно N.
А если среди других команд окажется одна с быстрой клавишей CtrlV или CtrlN?
В этом плане, а также и во многих других случаях нужно будет подходить творчески, и заранее всё предусмотреть не получится.
В общем, для начала, мне кажется, надо как-то формализовать подход. К примеру, запретить вторичную клавишу, идентичную первичной, для всех макросов, кроме Native.
А вот этого точно делать не надо бы, а то нарушится гибкость возможности обособленного и комбинированного показа нативных команд.
Или в макросе, если нажата повторно первичная клавиша, принудительно запускать пункт Native.
И это тоже было бы лишним. Поскольку иногда нужно нативную команду сделать приоритетной, а иногда, напротив, — вторичной. А вот показывать целесообразно и ту, и ту. Т.е. обе выводить в меню выбора макроса.

И как резюме: ИМХО, у Вас уже получается чуть ли не идеальная комбинация скриптов (key2Process.lua плюс запись в _macroinit.lua) для решения изначально поставленной в настоящей теме задачи. И, как мне представляется, ещё немножко тонкой доводки и будет вполне готовый замечательный вариант.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Tue 18 Dec, 2018 12:13
by sToLp
IgorZ wrote: Mon 17 Dec, 2018 11:09 Как вообще должен выглядеть такой пункт ... ?
Например, так:
primerDel.png
И если есть желание или необходимость посмотреть на практике как подобные меню получаются на текущий момент, то можно скопировать в какую-либо папку ночнушку, начинить её файлами из приаттаченного , запустить данную копию Far`а и нажать на Del.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Wed 19 Dec, 2018 06:32
by IgorZ
Ладно, тогда вот новая версия. Теперь это модуль, соответственно, использовать его надо иначе.
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2.  
  3. local nfo = Info {_filename or ...,
  4.  
  5.   name          = "key2 process";
  6.  
  7.   description   = "Обработка последовательности двух клавиатурных комбинаций";
  8.  
  9.   version       = "0.9.1"; --http://semver.org/lang/ru/
  10.  
  11.   author        = "IgorZ";
  12.  
  13. --  url           = "http://forum.farmanager.com/viewtopic.php?t=8465";
  14.  
  15.   id            = "F571989C-F7FA-4C55-B9AD-5E0974F1CDF5";
  16.  
  17.   minfarversion = {3,0,0,4000,0};
  18.  
  19. --  files         = "*Eng.hlf;*Rus.hlf;*Eng.lng;*Rus.lng";
  20.  
  21.   helptxt       = [[
  22.  
  23.   Обрабатывает два дополнительных поля в определении Macro:
  24.  
  25.     - key2:  вторичная клавиатурная комбинация, работающая в меню выбора макроса;
  26.  
  27.     - bdsize: длина, отводимая под базовую часть описания.
  28.  
  29.   Добавляет key2 в конец описания.
  30.  
  31.   Параметр alignkey определяет, как выравнивать key2:
  32.  
  33.     - L: по левому краю key2;
  34.  
  35.     - C: по границе между модификаторами и клавишей в key2;
  36.  
  37.     - R: по правому краю key2.
  38.  
  39.   Параметр bdsize определяет длину, отводимую под базовую часть описания,
  40.  
  41.     если поле bdsize в Macro не определено.
  42.  
  43.   Для использования добавить в _macroinit.lua строки ниже.
  44.  
  45.   Если данный файл лежит не в каталоге "scripts", исправить путь.
  46.  
  47.  
  48.  
  49.   local _,Add_key2 = pcall(require,"key2Process")
  50.  
  51.   if type(Add_key2)=="table" then Macro(Add_key2.macro) Add_key2.init() end
  52.  
  53. ]];
  54.  
  55.   history       = [[
  56.  
  57. 2018/12/14 v0.9.0 - Публичная бета.
  58.  
  59. 2018/12/17 v0.9.1 - Скрипт теперь модуль. key2l переименован в bdsize. Добавлена глобальная настройка bdsize, аналогичная одноимённому параметру
  60.  
  61.                     функции Macro. Если описание начинается с "Native", быстрая клавиша не изменяется. Некоторая оптимизация.
  62.  
  63. ]];
  64.  
  65.   options       = {
  66.  
  67.     alignkey = "L",--"L","C","R"
  68.  
  69. --    bdsize = 0,
  70.  
  71.   }
  72.  
  73. }
  74.  
  75. if not nfo then return end
  76.  
  77. -- +
  78.  
  79. --[[константы]]
  80.  
  81. -- -
  82.  
  83. local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- меню выбора макросов
  84.  
  85. local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)") -- модификаторы
  86.  
  87. -- +
  88.  
  89. --[[переменные]]
  90.  
  91. -- -
  92.  
  93. local w,OldAddRegularMacro = Far.Width-32
  94.  
  95. -- +
  96.  
  97. --[=[функции]=]
  98.  
  99. -- -
  100.  
  101. local function GetModKey(key) local m,k = ((rx:match("     "..key)or""):sub(6)) k = key:sub(m:len()+1) return m,k end --[=[модификатор и клавиша]=]
  102.  
  103. --
  104.  
  105. local function getUpvalue(f,name) --[=[получить локальную переменную для функции]=]
  106.  
  107. for i=1,math.huge do -- переберём все переменные
  108.  
  109.   local n,v = debug.getupvalue (f,i) -- достанем очередную
  110.  
  111.   if n==nil then error("unable to get upvalue: "..name) end -- кончились - не найдена :(
  112.  
  113.   if n==name then return v,i end -- нашли - вернём и закончим
  114.  
  115. end
  116.  
  117. end
  118.  
  119. --
  120.  
  121. local function AddRegularMacroNew(m,fp) --[=[добавить макрос]=]
  122.  
  123. if type(m.key2)=="string" and type(m.description)=="string" then -- есть key2 и description?
  124.  
  125.   local modk2,keyk2 = GetModKey(m.key2) -- разделим вторичную клавиатурную комбинацию на модификатор и клавишу
  126.  
  127.   local N = m.description:match("^&Native") -- признак макроса, вызывающего команду Far
  128.  
  129.   local wk2 = (math.min(type(m.bdsize)=="number" and m.bdsize or type(nfo.options.bdsize)=="number" and nfo.options.bdsize or w,98))+(N and 1 or 0)
  130.  
  131.   local fmt = "%-"..wk2.."."..wk2.."s %"..(({L="",C=14,R=(19-keyk2:len())})[nfo.options.alignkey] or 14).."s%s%s" -- формат нового описания
  132.  
  133.   m.description = fmt:format(m.description:gsub("&",N and "&" or ""),modk2,(N or keyk2:len()>1) and "" or "&",keyk2) -- и само оно
  134.  
  135. end
  136.  
  137. return OldAddRegularMacro(m,fp) -- добавим скорректированный (или нет) макрос с помощью стандартной функции
  138.  
  139. end
  140.  
  141. --
  142.  
  143. local function ReplaceAddRegularMacro() --[=[заменить функцию добавления макроса на свою]=]
  144.  
  145. local LoadMacros = getUpvalue(eval,"utils").LoadMacros -- достанем LoadMacros из utils - он использует AddRegularMacro
  146.  
  147. local AddRegularMacro,iAddRegularMacro = getUpvalue(LoadMacros,"AddRegularMacro") -- достанем сам AddRegularMacro
  148.  
  149. if not OldAddRegularMacro then OldAddRegularMacro = AddRegularMacro end -- запомним его
  150.  
  151. debug.setupvalue (LoadMacros,iAddRegularMacro,assert(AddRegularMacroNew)) -- и заменим на наш
  152.  
  153. end
  154.  
  155. -- +
  156.  
  157. --[=[макрос]=]
  158.  
  159. -- -
  160.  
  161. local macro = {
  162.  
  163.   id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
  164.  
  165.   description="Обработка вторичной клавиатурной комбинации в меню выбора макроса";
  166.  
  167.   area="Menu"; key="/.+/"; priority=100;
  168.  
  169.   condition=function() return Menu.Id==MSMenuGuid end; -- если это меню выбора, то будем работать
  170.  
  171.   action=function()
  172.  
  173. local mod,k = GetModKey(akey(1,0)) -- получим модификатор и клавишу и нажмём, если первичный или вторичный модификатор + клавиша есть в списке
  174.  
  175. Keys((Menu.Select(" "..mod..k,2,0)>0 or (mod=="" and Menu.Select(" "..GetModKey(Object.Title:match("%S+$"))..k,2,0)>0)) and "Enter" or "AKey")
  176.  
  177.   end;
  178.  
  179. }
  180.  
  181. --
  182.  
  183. return {init=ReplaceAddRegularMacro,macro=macro} -- вызвавшему отдадим функцию замены AddRegularMacro и макрос
Изменения:
  • скрипт теперь модуль, соответственно, класть его следует в %FARPROFILE%\Macros\Modules, и его подключение теперь выглядит так:

    Code: Select all

    local _,Add_key2 = pcall(require,"key2Process")
    if type(Add_key2)=="table" then Macro(Add_key2.macro) Add_key2.init() end
    
  • key2l переименован в bdsize: новое название более адекватно отражает суть поля;
  • добавлена глобальная настройка bdsize, аналогичная одноимённому параметру функции Macro и при наличии действующая на все макросы с key2, в которых отсутствует локальное поле bdsize;
  • если описание начинается с "Native", быстрая клавиша не изменяется.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Wed 19 Dec, 2018 09:36
by sToLp
IgorZ wrote: Wed 19 Dec, 2018 06:32вот новая версия
Замечательно!
[*]добавлена глобальная настройка bdsize, аналогичная одноимённому параметру функции Macro и при наличии действующая на все макросы с key2, в которых отсутствует локальное поле bdsize;
Спасибо! По-моему, это очень правильное решение! Ведь изредка подстраивать размер поля при необходимости гораздо удобнее, чем постоянно настраивать его в каждом макросе.
[*]если описание начинается с "Native", быстрая клавиша не изменяется.
Тоже очень хорошо! Большое спасибо!

При этом проявилась одна существенная необходимость. Уберите, пожалуйста, из обработки скриптом двойные нажатия на чистые модификаторы. В моём случае, использование таких ключей распространяется сразу на группы макросов и поэтому обработка настоящим скриптом конкретно этих ключей не удобна.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Thu 20 Dec, 2018 04:46
by sToLp
IgorZ,
На иллюстрации приводится реальное "исторически сложившееся" на текущий момент меню, вызываемое ключом F2:
F02.png
Полагаю, что было бы целесообразным, если это технически возможно, в правой колонке ключей исключать из подсвечиваемых конечные цифры и литеры, совпадающие с присутствующими в левой колонке цифрами/литерами. Не только из состава функциональных клавиш, а из любых одноклавиш и сочетаний. Это в идеале. Возможно, проще было бы вообще не подсвечивать конечные цифры от 1 до 9 и семь конечных литер — A B C D E F и G. Вероятно, этого набора неподсвечиваемых конечных знаков было бы достаточно, поскольку больше шестнадцати позиций в меню это уже, как правило, перебор.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Fri 21 Dec, 2018 05:11
by IgorZ
Почему-то в последние дни перестали приходить оповещения на почту, поэтому новые сообщения увидел только сегодня.
sToLp wrote: Wed 19 Dec, 2018 09:36Уберите, пожалуйста, из обработки скриптом двойные нажатия на чистые модификаторы. В моём случае, использование таких ключей распространяется сразу на группы макросов и поэтому обработка настоящим скриптом конкретно этих ключей не удобна.
Не понял. Можно подробнее и с конкретным примером?
sToLp wrote: Thu 20 Dec, 2018 04:46 IgorZ,
На иллюстрации приводится реальное "исторически сложившееся" на текущий момент меню, вызываемое ключом F2:
F02.png
Полагаю, что было бы целесообразным, если это технически возможно, в правой колонке ключей исключать из подсвечиваемых конечные цифры и литеры, совпадающие с присутствующими в левой колонке цифрами/литерами. Не только из состава функциональных клавиш, а из любых одноклавиш и сочетаний. Это в идеале. Возможно, проще было бы вообще не подсвечивать конечные цифры от 1 до 9 и семь конечных литер — A B C D E F и G. Вероятно, этого набора неподсвечиваемых конечных знаков было бы достаточно, поскольку больше шестнадцати позиций в меню это уже, как правило, перебор.
Надо подумать, как это лучше сделать. Сильно перегружать код тоже нежелательно.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Fri 21 Dec, 2018 08:16
by sToLp
IgorZ wrote: Fri 21 Dec, 2018 05:11
sToLp wrote: Thu 20 Dec, 2018 04:46 Полагаю, что было бы целесообразным, если это технически возможно, в правой колонке ключей исключать из подсвечиваемых конечные цифры и литеры, совпадающие с присутствующими в левой колонке цифрами/литерами. Не только из состава функциональных клавиш, а из любых одноклавиш и сочетаний.
Надо подумать, как это лучше сделать. Сильно перегружать код тоже нежелательно.
Вполне согласен. Поскольку думать всегда полезно. Вплоть до того, что м.б. рассмотреть и вариант оставить как есть сейчас. Поскольку опытный пользователь быстро сообразит как поменять ключи дабы хоткеи не пересекались. А не очень опытный решится задать вопрос на форуме и тоже получит аналогичный совет.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Fri 21 Dec, 2018 11:00
by sToLp
IgorZ wrote: Fri 21 Dec, 2018 05:11
sToLp wrote: Wed 19 Dec, 2018 09:36Уберите, пожалуйста, из обработки скриптом двойные нажатия на чистые модификаторы.
Не понял. Можно подробнее и с конкретным примером?
Привожу ограниченный практический пример применения двойных нажатий на левый и правый контролы. Большинство макросов, необходимо приведённых в составе данного примера, не проверялись на возможные отказы срабатывания в условиях отличных от тех конкретных, в которых они практически используются, и поэтому при тестировании примера могут быть и некоторые локальные сбои, для целей примера не существенные. Поскольку, всё же, необходимые для демонстрации работы чистых модификаторов меню выбора макроса должны вызываться и макросы, активируемые двойными нажатиями на LCtrl или на RCtr, также должны полноценно работать.

Под спойлерами приведены картинки с составами соответствующих меню данного примера, листинги всех участвующих в примере макросов, а также приводится листинг файла Far.exe.ini, используемого в примере для обеспечения работы ночнушки в портабельном режиме.



В наборах макросов примера на двойные нажатия на чистые LCtrl и RCtr навешены переходы от одного меню выбора макроса к другому по кругу туда и обратно без выхода в панели. Обозначения такого перехода приводятся всегда в нижней позиции меню выбора макроса: дважды LCtrl к меню назад ← → вперёд к меню RCtrl дважды.

В самом примере в целях облегчения показа работы этих переходов приоритет макроса обработки вторичной комбинации понижен на один пункт. Но если этого не делать, то при двойном нажатии на соответствующий Ctrl происходит накладка:
nakladka.png
По моему мнению, ввиду специфичности чистых модификаторов как особых ключей обработку двойных нажатий на них макросу обработки вторичной клавиатурной комбинации в меню выбора макроса делать не надо бы. Поэтому я и изложил свою просьбу. Однако, если Вы, по какой-либо причине полагаете, что исключать их из обработки макросом не следует, то, разумеется, можно ограничиться и регулированием этого посредством величины поля priority.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Mon 24 Dec, 2018 12:42
by IgorZ
sToLp wrote: Fri 21 Dec, 2018 11:00 По моему мнению, ввиду специфичности чистых модификаторов как особых ключей обработку двойных нажатий на них макросу обработки вторичной клавиатурной комбинации в меню выбора макроса делать не надо бы. Поэтому я и изложил свою просьбу. Однако, если Вы, по какой-либо причине полагаете, что исключать их из обработки макросом не следует, то, разумеется, можно ограничиться и регулированием этого посредством величины поля priority.
Тут вот какой нюанс. Вы везде предлагали предоставлять максимальную гибкость настройки пользователю (и это, хоть и в чём-то спорная, но вполне разумная и логичная позиция). Однако, данное предложение противоречит общей "линии партии". Поэтому из чисто идеологических оснований я предлагаю оставить за пользователем возможность назначить любые, в том числе и такие клавиатурные комбинации. Как следует из Ваших же слов, это не доставит Вам принципиальных проблем.
P. S. А почему двойной Ctrl, а не, скажем, более, на мой взгляд напрашивающийся, да и, пожалуй, более удобный CtrlLeft/CtrlRight? Или Вы их используете в качестве вторичных клавиш?
P. P. S. Кстати, вот и возражение, основывающееся на посылке, более "материальной", чем идеология. Ведь другой пользователь может захотеть "особой" роли для другого комплекта клавиатурных комбинаций. Уж лучше сразу остановиться, чем доводить до абсурда.
P. P. P. S. Собственно, в связи с грядущим Новым Годом я вынужден приостановить любую деятельность на ниве свободного программирования. После зимних каникул можно вернуться к этому вопросу. Наверняка, за это время все мы разродимся новыми идеями, идиотскими или гениальными. Вот и продолжим, ко всеобщему удовольствию.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Mon 24 Dec, 2018 14:31
by sToLp
IgorZ wrote: Mon 24 Dec, 2018 12:42 предлагаю оставить за пользователем возможность назначить любые, в том числе и такие [т.е. двойные нажатия на чистые модификаторы] клавиатурные комбинации
Хорошо! Посмотрим практику, поупражняемся, подумаем. Ведь и не исключено же, что это будет как раз наилучший вариант.
IgorZ wrote: Mon 24 Dec, 2018 12:42 P. S. А почему двойной Ctrl, а не, скажем, более, на мой взгляд напрашивающийся, да и, пожалуй, более удобный CtrlLeft/CtrlRight? Или Вы их используете в качестве вторичных клавиш?
CtrlLeft/CtrlRight давно уже используются в других макросах, и это уже вошло в привычку. А двойной Ctrl я пока что ни разу не видел в качестве ключа, кроме того варианта, что сам употребляю. И тоже уже привычно и представляется более удобным, чем иные ключи. А кроме того, благодаря John Doe, помимо двойных Ctrl`ов для аналогичных переходов применяю также и двойные Alt`ы, и двойной Shift, в комплексе. Но об этом как нибудь потом.
IgorZ wrote: Mon 24 Dec, 2018 12:42Собственно, в связи с грядущим Новым Годом я вынужден приостановить любую деятельность на ниве свободного программирования. После зимних каникул можно вернуться к этому вопросу. Наверняка, за это время все мы разродимся новыми идеями, идиотскими или гениальными. Вот и продолжим, ко всеобщему удовольствию.
Очень рад, что сабж доставляет Вам удовольствие. И очень надеюсь, что он Вам не наскучит. А спешить, собственно, некуда и, даже напротив, ввиду охвата данной темой множества макросов и ещё большего множества вариантов их возможных комбинаций нужно время как для основательного освоения материала, так и для некоторого отдыха от него тоже.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Wed 09 Jan, 2019 11:09
by IgorZ
Новая версия.
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2.  
  3. local nfo = Info {_filename or ...,
  4.  
  5.   name          = "key2 process";
  6.  
  7.   description   = "Обработка последовательности двух клавиатурных комбинаций";
  8.  
  9.   version       = "0.9.2"; --http://semver.org/lang/ru/
  10.  
  11.   author        = "IgorZ";
  12.  
  13. --  url           = "http://forum.farmanager.com/viewtopic.php?t=8465";
  14.  
  15.   id            = "F571989C-F7FA-4C55-B9AD-5E0974F1CDF5";
  16.  
  17.   minfarversion = {3,0,0,4000,0};
  18.  
  19. --  files         = "*Eng.hlf;*Rus.hlf;*Eng.lng;*Rus.lng";
  20.  
  21.   helptxt       = [[
  22.  
  23.   Обрабатывает два дополнительных поля в определении Macro:
  24.  
  25.     - key2:  вторичная клавиатурная комбинация, работающая в меню выбора макроса;
  26.  
  27.     - bdsize: длина, отводимая под базовую часть описания.
  28.  
  29.   Добавляет key2 в конец описания.
  30.  
  31.   Параметр alignkey определяет, как выравнивать key2:
  32.  
  33.     - L: по левому краю key2;
  34.  
  35.     - C: по границе между модификаторами и клавишей в key2;
  36.  
  37.     - R: по правому краю key2.
  38.  
  39.   Параметр bdsize определяет длину, отводимую под базовую часть описания,
  40.  
  41.     если поле bdsize в Macro не определено.
  42.  
  43.   Параметр excludekeys определяет, какие клавиатурные комбинации следует игнорировать.
  44.  
  45.     Между собой комбинации разделяются пробелами.
  46.  
  47.   Для использования добавить в _macroinit.lua строки ниже.
  48.  
  49.   Если данный файл лежит не в каталоге "scripts", исправить путь.
  50.  
  51.  
  52.  
  53.   local _,Add_key2 = pcall(require,"key2Process")
  54.  
  55.   if type(Add_key2)=="table" then Macro(Add_key2.macro) Add_key2.init() end
  56.  
  57. ]];
  58.  
  59.   history       = [[
  60.  
  61. 2018/12/14 v0.9.0 - Публичная бета.
  62.  
  63. 2018/12/17 v0.9.1 - Скрипт теперь модуль. key2l переименован в bdsize. Добавлена глобальная настройка bdsize, аналогичная одноимённому параметру
  64.  
  65.                     функции Macro. Если описание начинается с "Native", быстрая клавиша не изменяется. Некоторая оптимизация.
  66.  
  67. 2019/01/09 v0.9.2 - Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать.
  68.  
  69.                     Между собой комбинации разделяются пробелами.
  70.  
  71. ]];
  72.  
  73.   options       = {
  74.  
  75.     alignkey = "C",--"L","C","R"
  76.  
  77. --    bdsize = 0,
  78.  
  79.     excludekeys = "",
  80.  
  81.   }
  82.  
  83. }
  84.  
  85. if not nfo then return end
  86.  
  87. -- +
  88.  
  89. --[[константы]]
  90.  
  91. -- -
  92.  
  93. local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- меню выбора макросов
  94.  
  95. local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)") -- модификаторы
  96.  
  97. -- +
  98.  
  99. --[[переменные]]
  100.  
  101. -- -
  102.  
  103. local w,OldAddRegularMacro = Far.Width-32
  104.  
  105. -- +
  106.  
  107. --[=[функции]=]
  108.  
  109. -- -
  110.  
  111. local function GetModKey(key) local m,k = ((rx:match("     "..key)or""):sub(6)) k = key:sub(m:len()+1) return m,k end --[=[модификатор и клавиша]=]
  112.  
  113. --
  114.  
  115. local function getUpvalue(f,name) --[=[получить локальную переменную для функции]=]
  116.  
  117. for i=1,math.huge do -- переберём все переменные
  118.  
  119.   local n,v = debug.getupvalue (f,i) -- достанем очередную
  120.  
  121.   if n==nil then error("unable to get upvalue: "..name) end -- кончились - не найдена :(
  122.  
  123.   if n==name then return v,i end -- нашли - вернём и закончим
  124.  
  125. end
  126.  
  127. end
  128.  
  129. --
  130.  
  131. local function AddRegularMacroNew(m,fp) --[=[добавить макрос]=]
  132.  
  133. if type(m.key2)=="string" and type(m.description)=="string" then -- есть key2 и description?
  134.  
  135.   local m2,k2 = GetModKey(m.key2) -- разделим вторичную клавиатурную комбинацию на модификатор и клавишу
  136.  
  137.   local N = m.description:match("^&Native") -- признак макроса, вызывающего команду Far
  138.  
  139.   local wk2 = (math.min(type(m.bdsize)=="number" and m.bdsize or type(nfo.options.bdsize)=="number" and nfo.options.bdsize or w,98))+(N and 1 or 0)
  140.  
  141.   local fmt = "%-"..wk2.."."..wk2.."s %"..(({L="",C=14,R=(19-k2:len())})[nfo.options.alignkey] or 14).."s%s%s" -- формат нового описания
  142.  
  143.   m.description = fmt:format(m.description:gsub("&",N and "&" or ""),m2,(N or k2:len()>1) and "" or "&",k2) -- и само оно
  144.  
  145. end
  146.  
  147. return OldAddRegularMacro(m,fp) -- добавим скорректированный (или нет) макрос с помощью стандартной функции
  148.  
  149. end
  150.  
  151. --
  152.  
  153. local function ReplaceAddRegularMacro() --[=[заменить функцию добавления макроса на свою]=]
  154.  
  155. local LoadMacros = getUpvalue(eval,"utils").LoadMacros -- достанем LoadMacros из utils - он использует AddRegularMacro
  156.  
  157. local AddRegularMacro,iAddRegularMacro = getUpvalue(LoadMacros,"AddRegularMacro") -- достанем сам AddRegularMacro
  158.  
  159. if not OldAddRegularMacro then OldAddRegularMacro = AddRegularMacro end -- запомним его
  160.  
  161. debug.setupvalue (LoadMacros,iAddRegularMacro,assert(AddRegularMacroNew)) -- и заменим на наш
  162.  
  163. end
  164.  
  165. -- +
  166.  
  167. --[=[макрос]=]
  168.  
  169. -- -
  170.  
  171. local macro = {
  172.  
  173.   id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC"; area="Menu"; key="/.+/"; priority=100;
  174.  
  175.   description="Обработка вторичной клавиатурной комбинации в меню выбора макроса";
  176.  
  177.   condition=function(key) return Menu.Id==MSMenuGuid and not (" "..nfo.options.excludekeys.." "):cfind(" "..key.." ",1,true) end;
  178.  
  179.     -- если это меню выбора и клавиатурная комбинация не запрещена, то будем работать
  180.  
  181.   action=function()
  182.  
  183. local m2,k2 = GetModKey(akey(1,0)) -- получим модификатор и клавишу и нажмём, если первичный или вторичный модификатор + клавиша есть в списке
  184.  
  185. Keys((Menu.Select(" "..m2..k2,2,0)>0 or (m2=="" and Menu.Select(" "..GetModKey(Object.Title:match("%S+$"))..k2,2,0)>0)) and "Enter" or "AKey")
  186.  
  187.   end;
  188.  
  189. }
  190.  
  191. --
  192.  
  193. return {init=ReplaceAddRegularMacro,macro=macro} -- вызвавшему отдадим функцию замены AddRegularMacro и макрос
Изменения:
  • Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать. Между собой комбинации разделяются пробелами.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Wed 09 Jan, 2019 15:54
by Heir
IgorZ wrote: Wed 09 Jan, 2019 11:09 Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать. Между собой комбинации разделяются пробелами.
Очень хорошо. Эта настройка обязательно пригодится. А как в ней указать двойные нажатия на модификаторы (применяемые по форме, показанной John Doe)?

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Thu 10 Jan, 2019 04:23
by IgorZ
Heir wrote: Wed 09 Jan, 2019 15:54
IgorZ wrote: Wed 09 Jan, 2019 11:09 Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать. Между собой комбинации разделяются пробелами.
Очень хорошо. Эта настройка обязательно пригодится. А как в ней указать двойные нажатия на модификаторы (применяемые по форме, показанной John Doe)?
Никак.

Запуск макросов кнопкосочетаниями, нажатыми в меню выбора макроса.

Posted: Thu 10 Jan, 2019 05:09
by Heir
IgorZ, Понятно. Будем использовать ресурсы priority.