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

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

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

Post by IgorZ »

Latest post of the previous page:

sToLp wrote: Mon 10 Dec, 2018 17:10 IgorZ,

Многословный существенный .
Универсальность - это хорошо. Но в данном случае, по моему мнению, она не нужна. Поскольку комбинация из двух клавиатурных комбинаций, в которой вторая имеет не те же модификаторы, что и первая, теряет главное преимущество: удобство и скорость последовательного нажатия. В этом случае после первого нажатия приходится отпускать клавиши-модификаторы, и в результате нажатие одной только быстрой клавиши удобнее, чем вместе с модификатором. Иначе говоря, CtrlK CtrlF удобно, CtrlK F менее удобно, но CtrlK AltF совершенно неудобно.
Возможно, предлагаемый Вами подход был оправдан, когда вторая клавиатурная комбинация тоже находилась в key, из-за её попадания в число активных, но после вынесения в key2 она вообще перестаёт существовать для LuaMacro вне конкретного локального меню, что предоставляет полную свободу для выбора удобных вариантов. И наиболее удобными являются те, в которых префиксы первой и второй комбинаций совпадают.
Кстати, ранее Вы действовали, исходя именно из этих соображений (выделил жирным):
sToLp wrote: Tue 04 Dec, 2018 10:25
John Doe wrote: Mon 03 Dec, 2018 22:03 возможно для автора ценность не в запуске последовательностями
По моему убеждению, основная ценность — в целокупности, в неразрывной и желательно гармоничной связи с тем, что происходит за пределами непосредственно самого меню выбора макроса, как я попытался изложить это выше.
И вопрос, какими именно последовательностями осуществлять запуск макросов из данного меню, к этому также всецело относится как существенный момент. А поскольку Вы верно указали на противоречия в ключах приведённого примера, то я в файле поменял CtrlShiftE на AltShiftV и CtrlShiftW на AltShiftO, и посмотрю, как это скажется на дееспособности данных макросов практически.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

sToLp wrote: Mon 10 Dec, 2018 18:12
IgorZ wrote: Mon 10 Dec, 2018 06:06С другой стороны, Ваш вариант имеет свои достоинства. Какой лучше — с ходу не скажу.
Полагаю, что целесообразнее сравнивать не варианты приведённого Вами примера между собой. А оба их с исходным сабжевым макросом.
На всякий случай решил уточнить. Это моё замечание относилось конкретно к разным вариантам функции action, а не ко всему макросу. А то мне показалось, что Вы неправильно меня поняли.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Tue 11 Dec, 2018 05:54 наиболее удобными являются те [варианты комбинаций клавиш], в которых префиксы первой и второй комбинаций совпадают
Это бесспорно. И теоретически, и эстетически, и практически.
IgorZ wrote: Tue 11 Dec, 2018 05:54 ранее Вы действовали, исходя именно из этих соображений (выделил жирным):

sToLp писал(а):
Вт 04 дек, 2018 12:25

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

И при этом, в своей практике (а этой теме почти 3,5 года и она продолжает оставаться для меня животрепещущей) я ещё более многократно убеждался в необходимости реализации и более универсального подхода тоже. И со временем я попытаюсь продемонстрировать то, что он необходим, на работающих примерах. И буду очень рад узнать их оценку и с Вашей точки зрения тоже.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Tue 11 Dec, 2018 06:35 Это моё замечание относилось конкретно к разным вариантам функции action, а не ко всему макросу.
Всенепременно ещё и ещё раз внимательно испытаю оба варианта на практике и потом сообщу, что у меня в результате получится.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

С заменой стандартной функции Macro пока затык, так что, в качестве временной меры функция MMacro для _macroinit.lua:
  1. local w,OldMacro = math.min(Far.Width-31,99),Macro
  2.  
  3. local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)")
  4.  
  5. function _G.MMacro(m)
  6.  
  7.   if type(m.key2)=="string" then
  8.  
  9.     local mod = (rx:match("  "..m.key2)or""):sub(3)
  10.  
  11.     local k = m.key2:sub(mod:len()+1)
  12.  
  13.     m.description = ("%-"..w.."."..w.."s %14s%s%s"):format(m.description:gsub("&",""),mod,k:len()>1 and "" or "&",k)
  14.  
  15.   end
  16.  
  17.   return OldMacro(m)
  18.  
  19. end
  20.  
  21. mf.postmacro(function () _G.MMacro = nil end)
Примечания:
  1. Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
  2. Клавиатурные комбинации выравниваются по границе между модификатором и клавишей.
  3. Клавиши вида F1, PgDn и т. д. не подсвечиваются (увы, способ подсветки в меню нескольких символов подряд мне неизвестен).
Естественно, для максимальной эффективности нужен и модифицированный макрос для меню выбора:
  1. local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
  2.  
  3. local mod,k,rx = "","",regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)")
  4.  
  5. local function GetMod(key) return (rx:match("  "..key)or""):sub(3) end
  6.  
  7.  
  8.  
  9. Macro{
  10.  
  11.   id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
  12.  
  13.   area="Menu";
  14.  
  15.   key="/.+/";
  16.  
  17.   priority=100;
  18.  
  19.   condition=function(key)
  20.  
  21. mod = GetMod(key)
  22.  
  23. k = key:sub(mod:len()+1)
  24.  
  25. return Menu.Id==MSMenuGuid
  26.  
  27.   end;
  28.  
  29.   action=function()
  30.  
  31. if Menu.Select(" "..mod..k,2,0)>0 or (mod=="" and Menu.Select(" "..GetMod(Object.Title:match("%S+$"))..k,2,0)>0) then
  32.  
  33.   Keys("Enter")
  34.  
  35. else
  36.  
  37.   Keys("AKey")
  38.  
  39. end
  40.  
  41.   end;
  42.  
  43. }
Примечания:
  1. Быстрые клавиши вида F1, PgDn и т. д. поддерживаются, как и буквенные.
  2. Если модификатор первичной комбинации совпадает с модификатором вторичной, то можно нажимать вторичную как с модификаторами, так и без. Например, для первичной CtrlA и вторичной CtrlF1 можно нажать как CtrlF1, так и просто F1.
  3. Если модификатор первичной комбинации НЕ совпадает с модификатором вторичной, и клавиша не буквенная, то необходимо нажимать вторичную ТОЛЬКО с модификаторами. Например, для первичной CtrlA и вторичной AltF1 можно нажать ТОЛЬКО AltF1.
  4. Клавиши рассматриваются все без исключений, поскольку, если пользователь решил задействовать какую-то как вторичную для макроса, это его право, а если не задействовал, она отработает корректно.
P. S. В макрос для меню выбора вкраласть ошибка! Нечаянно не скопировал две последние строки. Макрос исправлен. Спасибо sToLp за обнаружение ошибки.
Last edited by IgorZ on Thu 13 Dec, 2018 06:16, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Wed 12 Dec, 2018 07:49 функция MMacro для _macroinit.lua

и модифицированный макрос для меню выбора
Благодарю Вас за щедрый подарок! Приступил к освоению.

UPD: Для начала: общее впечатление — прекрасное! Далее — о первых существенных нюансах:

а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.

б) в отношении в целом весьма удачной, на мой взгляд, установки:
1. Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
— желательно также в файлах с наборами макросов иметь возможность и дополнительной подстройки этих размеров тоже, поскольку ширина размеров меню в разных случаях может существенно варьироваться.

в) касательно же:
2. Клавиатурные комбинации выравниваются по границе между модификатором и клавишей.
— весьма желательно выравнивание сделать просто по правой границе меню, поскольку тогда меню в целом будет смотреться гораздо лучше.
Last edited by sToLp on Wed 12 Dec, 2018 22:36, edited 1 time in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

sToLp wrote: Wed 12 Dec, 2018 11:45 а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.
Повторить не удаётся. Возможно, из-за того, что я уже кое-что переделал.
sToLp wrote: Wed 12 Dec, 2018 11:45 б) в отношении в целом весьма удачной, на мой взгляд, установки:
1. Место под исходное описание выделяется, исходя из того, что при ширине экрана в 80 символов, максимальной длине комбинации модификаторов (RCtrlRAltShift) и имени клавиши в 5 символов результирующее описание должно полностью помещаться в строке меню. Для более широкого экрана, соответственно, и место под исходное описание выделяется больше.
— желательно также в файлах с наборами макросов иметь возможность и дополнительной подстройки этих размеров тоже, поскольку ширина размеров меню в разных случаях может существенно варьироваться.
Могу, разве что, добавить параметр в Macro, в пару к key2.
sToLp wrote: Wed 12 Dec, 2018 11:45 в) касательно же:
2. Клавиатурные комбинации выравниваются по границе между модификатором и клавишей.
— весьма желательно выравнивание сделать просто по правой границе меню, поскольку тогда меню в целом будет смотреться гораздо лучше.
Сделаю настройку.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Thu 13 Dec, 2018 07:49
sToLp wrote: Wed 12 Dec, 2018 11:45 а) при нажатии AltF4 на любой позиции в меню выбора макроса в редактор попадает не соответствующий этой позиции макрос, а _macroinit.lua.
Повторить не удаётся.
УТОЧНЕНИЕ: переход по AltF4 в _macroinit.lua происходит с позиций только тех макросов, определение которых MMacro, а с тех, у которых традиционное Macro, переход происходит по-старому — в соответствующий им файл.
IgorZ wrote: Thu 13 Dec, 2018 07:49 Могу, разве что, добавить параметр в Macro, в пару к key2.
Хорошо. Спасибо!
IgorZ wrote: Thu 13 Dec, 2018 07:49 Сделаю настройку.
И это тоже хорошо. Спасибо!
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

В общем, я тут подумал, вспомнил, что я не первый окучиваю эту грядку (с расширением возможностей Macro), творчески позаимствовал кое-что из модуля rebind авторства John Doe и таки родил нечто пристойное.
  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.0"; --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.     - key2l: длина, отводимая под базовую часть описания.
  28.  
  29.   Добавляет key2 в конец описания.
  30.  
  31.   alignkey определяет, как выравнивать key2:
  32.  
  33.     - L: по левому краю key2;
  34.  
  35.     - C: по границе между модификаторами и клавишей в key2;
  36.  
  37.     - R: по правому краю key2.
  38.  
  39.   Для использования добавить в _macroinit.lua строки ниже.
  40.  
  41.   Если данный файл лежит не в каталоге "scripts", исправить путь.
  42.  
  43.  
  44.  
  45.   local Add_key2 = loadfile(win.GetEnv("FARPROFILE").."\\Macros\\scripts\\key2Process.lua")
  46.  
  47.   if Add_key2 then Add_key2()() end
  48.  
  49. ]];
  50.  
  51.   history       = [[
  52.  
  53. 2018/12/14 v0.9.0 - Публичная бета.
  54.  
  55. ]];
  56.  
  57.   options       = {
  58.  
  59.     alignkey = "C",--"L","C","R"
  60.  
  61.   }
  62.  
  63. }
  64.  
  65. if not nfo then return end
  66.  
  67. -- +
  68.  
  69. --[[константы]]
  70.  
  71. -- -
  72.  
  73. local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
  74.  
  75. local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)")
  76.  
  77. -- +
  78.  
  79. --[[настройки]]
  80.  
  81. -- -
  82.  
  83. -- +
  84.  
  85. --[[переменные]]
  86.  
  87. -- -
  88.  
  89. local w,OldAddRegularMacro,mod,k = math.min(Far.Width-32,99)
  90.  
  91. -- +
  92.  
  93. --[=[вспомогательные функции]=]
  94.  
  95. -- -
  96.  
  97. local function GetMod(key) return (rx:match("  "..key)or""):sub(3) end
  98.  
  99.  
  100.  
  101. local function getUpvalue(f,name)
  102.  
  103. for i=1,math.huge do
  104.  
  105.   local n,v = debug.getupvalue (f,i)
  106.  
  107.   if n==nil then error("unable to get upvalue: "..name) end
  108.  
  109.   if n==name then return v,i end
  110.  
  111. end
  112.  
  113. end
  114.  
  115. --
  116.  
  117. local function AddRegularMacroNew(m,fp)
  118.  
  119. if type(m.key2)=="string" then
  120.  
  121.   local modk2 = (rx:match("  "..m.key2)or""):sub(3)
  122.  
  123.   local kk2 = m.key2:sub(modk2:len()+1)
  124.  
  125.   local wk2 = type(m.key2l)=="number" and m.key2l or w
  126.  
  127.   local fmt = "%-"..wk2.."."..wk2.."s %"..(({L="",C=14,R=(19-kk2:len())})[nfo.options.alignkey] or 14).."s%s%s"
  128.  
  129.   m.description = fmt:format(m.description:gsub("&",""),modk2,kk2:len()>1 and "" or "&",kk2)
  130.  
  131. end
  132.  
  133. return OldAddRegularMacro(m,fp)
  134.  
  135. end
  136.  
  137. --
  138.  
  139. local function ReplaceAddRegularMacro()
  140.  
  141. local LoadMacros = getUpvalue(eval,"utils").LoadMacros
  142.  
  143. local AddRegularMacro,iAddRegularMacro = getUpvalue(LoadMacros,"AddRegularMacro")
  144.  
  145. if not OldAddRegularMacro then OldAddRegularMacro = AddRegularMacro end
  146.  
  147. debug.setupvalue (LoadMacros,iAddRegularMacro,assert(AddRegularMacroNew))
  148.  
  149. end
  150.  
  151. -- +
  152.  
  153. --[=[Макрос]=]
  154.  
  155. -- -
  156.  
  157. if Macro then Macro{
  158.  
  159.   id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
  160.  
  161.   description="Обработка вторичной клавиатурной комбинации в меню выбора макроса";
  162.  
  163.   area="Menu"; key="/.+/"; priority=100;
  164.  
  165.   condition=function(key)
  166.  
  167. mod = GetMod(key)
  168.  
  169. k = key:sub(mod:len()+1)
  170.  
  171. return Menu.Id==MSMenuGuid
  172.  
  173.   end;
  174.  
  175.   action=function()
  176.  
  177. if Menu.Select(" "..mod..k,2,0)>0 or (mod=="" and Menu.Select(" "..GetMod(Object.Title:match("%S+$"))..k,2,0)>0) then
  178.  
  179.   Keys("Enter")
  180.  
  181. else
  182.  
  183.   Keys("AKey")
  184.  
  185. end
  186.  
  187.   end;
  188.  
  189. } end
  190.  
  191. --
  192.  
  193. return ReplaceAddRegularMacro
Особенности:
  • больше не требуется функция MMacro, вместо этого расширяется функциональность стандартной Macro;
  • настройка выравнивания вторичной клавиатурной комбинации с помощью параметра alignkey:
    • L: по левому краю key2;
    • C: по границе между модификаторами и клавишей в key2 (значение по умолчанию);
    • R: по правому краю key2.
  • поле key2l жёстко задаёт ширину базовой части description для конкретного макроса;
  • для использования положить файл в каталог scripts и вставить в _macroinit.lua следующий код:

    Code: Select all

    local Add_key2 = loadfile(win.GetEnv("FARPROFILE").."\\Macros\\scripts\\key2Process.lua")
    if Add_key2 then Add_key2()() end
Attachments
key2Process.lua.0.9.0.7z
(1.91 KiB) Downloaded 92 times
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Fri 14 Dec, 2018 05:54родил нечто пристойное
Шикарно! Большое спасибо!

, см. объяснение в следующем посте.
Last edited by sToLp on Sat 15 Dec, 2018 05:17, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ,
Практика показала, что я был не прав, когда просил:
sToLp wrote: Fri 14 Dec, 2018 10:05 пожелание в отношении:
- key2l: длина, отводимая под базовую часть описания.
Желательно бы не "под базовую часть описания", а под всю позицию в меню, включая указание клавиши/сочетания.
Потому что при выключке (т.е. выравнивании) строк влево alignkey = "L" получаются вполне приемлемые результаты по сравнению с выключкой вправо alignkey = "R" и, тем более, по сравнению с выключкой по границе между модификаторами и клавишей в key2 alignkey = "C". этого приводится на примере подборки макросов разных способов удаления файлов/папок нажатием клавиши Del и далее в меню выбора макроса соответствующими клавишами/сочетаниями.

Поэтому полагаю, что усложнять в этом отношении ни чего не нужно. И, более того, возможно даже стоит чуток упростить key2Process.lua и оставить выключку только влево "вшитой".
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

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 в указанных макросах. А этого мне, собственно, и нужно было.

Посмотрите, пожалуйста, насколько это мною сделано корректно в принципе и нельзя ли этого же результата достичь более цивильно?
Last edited by sToLp on Sat 15 Dec, 2018 20:44, edited 1 time in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post 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. В общем, как-то постараться снизить уровень возможного хаоса.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post 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) для решения изначально поставленной в настоящей теме задачи. И, как мне представляется, ещё немножко тонкой доводки и будет вполне готовый замечательный вариант.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

IgorZ wrote: Mon 17 Dec, 2018 11:09 Как вообще должен выглядеть такой пункт ... ?
Например, так:
primerDel.png
И если есть желание или необходимость посмотреть на практике как подобные меню получаются на текущий момент, то можно скопировать в какую-либо папку ночнушку, начинить её файлами из приаттаченного , запустить данную копию Far`а и нажать на Del.
Attachments
Del_she.7z
(6.74 KiB) Downloaded 84 times
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post 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", быстрая клавиша не изменяется.
Attachments
key2Process.lua.0.9.1.7z
(2.58 KiB) Downloaded 90 times
Post Reply

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