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

Здесь обсуждается всё, что касается макросов.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 8 times

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

Post by sToLp » Wed 19 Dec, 2018 09:36

Latest post of the previous page:

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

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

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 8 times

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

Post by sToLp » Thu 20 Dec, 2018 04:46

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

IgorZ
Posts: 600
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 36 times

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

Post by IgorZ » Fri 21 Dec, 2018 05:11

Почему-то в последние дни перестали приходить оповещения на почту, поэтому новые сообщения увидел только сегодня.
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. Вероятно, этого набора неподсвечиваемых конечных знаков было бы достаточно, поскольку больше шестнадцати позиций в меню это уже, как правило, перебор.
Надо подумать, как это лучше сделать. Сильно перегружать код тоже нежелательно.

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 8 times

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

Post by sToLp » Fri 21 Dec, 2018 08:16

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

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 8 times

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

Post by sToLp » Fri 21 Dec, 2018 11:00

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.
Attachments
2018_12_21.7z
Файлы с примером.
(17.18 KiB) Downloaded 15 times

IgorZ
Posts: 600
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 36 times

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

Post by IgorZ » Mon 24 Dec, 2018 12:42

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

User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 107 times
Been thanked: 8 times

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

Post by sToLp » Mon 24 Dec, 2018 14:31

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
Собственно, в связи с грядущим Новым Годом я вынужден приостановить любую деятельность на ниве свободного программирования. После зимних каникул можно вернуться к этому вопросу. Наверняка, за это время все мы разродимся новыми идеями, идиотскими или гениальными. Вот и продолжим, ко всеобщему удовольствию.
Очень рад, что сабж доставляет Вам удовольствие. И очень надеюсь, что он Вам не наскучит. А спешить, собственно, некуда и, даже напротив, ввиду охвата данной темой множества макросов и ещё большего множества вариантов их возможных комбинаций нужно время как для основательного освоения материала, так и для некоторого отдыха от него тоже.

IgorZ
Posts: 600
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 36 times

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

Post by IgorZ » Wed 09 Jan, 2019 11:09

Новая версия.
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2. local nfo = Info {_filename or ...,
  3.   name          = "key2 process";
  4.   description   = "Обработка последовательности двух клавиатурных комбинаций";
  5.   version       = "0.9.2"; --http://semver.org/lang/ru/
  6.   author        = "IgorZ";
  7. --  url           = "http://forum.farmanager.com/viewtopic.php?t=8465";
  8.   id            = "F571989C-F7FA-4C55-B9AD-5E0974F1CDF5";
  9.   minfarversion = {3,0,0,4000,0};
  10. --  files         = "*Eng.hlf;*Rus.hlf;*Eng.lng;*Rus.lng";
  11.   helptxt       = [[
  12.   Обрабатывает два дополнительных поля в определении Macro:
  13.     - key2:  вторичная клавиатурная комбинация, работающая в меню выбора макроса;
  14.     - bdsize: длина, отводимая под базовую часть описания.
  15.   Добавляет key2 в конец описания.
  16.   Параметр alignkey определяет, как выравнивать key2:
  17.     - L: по левому краю key2;
  18.     - C: по границе между модификаторами и клавишей в key2;
  19.     - R: по правому краю key2.
  20.   Параметр bdsize определяет длину, отводимую под базовую часть описания,
  21.     если поле bdsize в Macro не определено.
  22.   Параметр excludekeys определяет, какие клавиатурные комбинации следует игнорировать.
  23.     Между собой комбинации разделяются пробелами.
  24.   Для использования добавить в _macroinit.lua строки ниже.
  25.   Если данный файл лежит не в каталоге "scripts", исправить путь.
  26.  
  27.   local _,Add_key2 = pcall(require,"key2Process")
  28.   if type(Add_key2)=="table" then Macro(Add_key2.macro) Add_key2.init() end
  29. ]];
  30.   history       = [[
  31. 2018/12/14 v0.9.0 - Публичная бета.
  32. 2018/12/17 v0.9.1 - Скрипт теперь модуль. key2l переименован в bdsize. Добавлена глобальная настройка bdsize, аналогичная одноимённому параметру
  33.                     функции Macro. Если описание начинается с "Native", быстрая клавиша не изменяется. Некоторая оптимизация.
  34. 2019/01/09 v0.9.2 - Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать.
  35.                     Между собой комбинации разделяются пробелами.
  36. ]];
  37.   options       = {
  38.     alignkey = "C",--"L","C","R"
  39. --    bdsize = 0,
  40.     excludekeys = "",
  41.   }
  42. }
  43. if not nfo then return end
  44. -- +
  45. --[[константы]]
  46. -- -
  47. local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- меню выбора макросов
  48. local rx = regex.new("(.*)(?<=LCtrl|.LAlt|RCtrl|.RAlt|.Ctrl|..Alt|Shift)(?!LCtrl|LAlt|RCtrl|RAlt|Ctrl|Alt|Shift)") -- модификаторы
  49. -- +
  50. --[[переменные]]
  51. -- -
  52. local w,OldAddRegularMacro = Far.Width-32
  53. -- +
  54. --[=[функции]=]
  55. -- -
  56. local function GetModKey(key) local m,k = ((rx:match("     "..key)or""):sub(6)) k = key:sub(m:len()+1) return m,k end --[=[модификатор и клавиша]=]
  57. --
  58. local function getUpvalue(f,name) --[=[получить локальную переменную для функции]=]
  59. for i=1,math.huge do -- переберём все переменные
  60.   local n,v = debug.getupvalue (f,i) -- достанем очередную
  61.   if n==nil then error("unable to get upvalue: "..name) end -- кончились - не найдена :(
  62.   if n==name then return v,i end -- нашли - вернём и закончим
  63. end
  64. end
  65. --
  66. local function AddRegularMacroNew(m,fp) --[=[добавить макрос]=]
  67. if type(m.key2)=="string" and type(m.description)=="string" then -- есть key2 и description?
  68.   local m2,k2 = GetModKey(m.key2) -- разделим вторичную клавиатурную комбинацию на модификатор и клавишу
  69.   local N = m.description:match("^&Native") -- признак макроса, вызывающего команду Far
  70.   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)
  71.   local fmt = "%-"..wk2.."."..wk2.."s %"..(({L="",C=14,R=(19-k2:len())})[nfo.options.alignkey] or 14).."s%s%s" -- формат нового описания
  72.   m.description = fmt:format(m.description:gsub("&",N and "&" or ""),m2,(N or k2:len()>1) and "" or "&",k2) -- и само оно
  73. end
  74. return OldAddRegularMacro(m,fp) -- добавим скорректированный (или нет) макрос с помощью стандартной функции
  75. end
  76. --
  77. local function ReplaceAddRegularMacro() --[=[заменить функцию добавления макроса на свою]=]
  78. local LoadMacros = getUpvalue(eval,"utils").LoadMacros -- достанем LoadMacros из utils - он использует AddRegularMacro
  79. local AddRegularMacro,iAddRegularMacro = getUpvalue(LoadMacros,"AddRegularMacro") -- достанем сам AddRegularMacro
  80. if not OldAddRegularMacro then OldAddRegularMacro = AddRegularMacro end -- запомним его
  81. debug.setupvalue (LoadMacros,iAddRegularMacro,assert(AddRegularMacroNew)) -- и заменим на наш
  82. end
  83. -- +
  84. --[=[макрос]=]
  85. -- -
  86. local macro = {
  87.   id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC"; area="Menu"; key="/.+/"; priority=100;
  88.   description="Обработка вторичной клавиатурной комбинации в меню выбора макроса";
  89.   condition=function(key) return Menu.Id==MSMenuGuid and not (" "..nfo.options.excludekeys.." "):cfind(" "..key.." ",1,true) end;
  90.     -- если это меню выбора и клавиатурная комбинация не запрещена, то будем работать
  91.   action=function()
  92. local m2,k2 = GetModKey(akey(1,0)) -- получим модификатор и клавишу и нажмём, если первичный или вторичный модификатор + клавиша есть в списке
  93. 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")
  94.   end;
  95. }
  96. --
  97. return {init=ReplaceAddRegularMacro,macro=macro} -- вызвавшему отдадим функцию замены AddRegularMacro и макрос
Изменения:
  • Добавлена глобальная настройка excludekeys, указывающая, какие клавиатурные комбинации следует игнорировать. Между собой комбинации разделяются пробелами.
Attachments
key2Process.lua.0.9.2.7z
(2.72 KiB) Downloaded 23 times

Heir
Posts: 4
Joined: Wed 09 Jan, 2019 15:17
Has thanked: 3 times

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

Post by Heir » Wed 09 Jan, 2019 15:54

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

IgorZ
Posts: 600
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 36 times

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

Post by IgorZ » Thu 10 Jan, 2019 04:23

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

Heir
Posts: 4
Joined: Wed 09 Jan, 2019 15:17
Has thanked: 3 times

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

Post by Heir » Thu 10 Jan, 2019 05:09

IgorZ, Понятно. Будем использовать ресурсы priority.

Post Reply

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