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

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

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

Post by sToLp »

Latest post of the previous page:

John Doe wrote: Thu 06 Dec, 2018 11:43 [предыдущий] регэксп захватывает только последнюю клавишу, поэтому вероятно надо скомбинировать.

Code: Select all

local rkey = m.key:match" (.+)$" or m.key:match"%S+$"
Спасибо большое! Испытал и этот вариант регекса и пришёл к выводу, что усложнять, пожалуй, и не стоит, раз уже есть решение точно соответствующее изначально поставленной задаче вывода на показ только последнего ключа. Но в загашник на случай потребности в отладке сборок макросов по набору ключей этот вариант себе отложил.
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 06 Dec, 2018 12:05
sToLp wrote: Thu 06 Dec, 2018 11:57 И, если можно, то ещё бы при наличии лишь одного ключа в поле key выводить в меню этот ключ.
А зачем? Ведь очевидно, что это тот ключ, которым вызвано меню.
Да, а далее этим же самым ключом из меню выбора макроса вызывается меню плагина.

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

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

Post by sToLp »

На текущий момент сделал так:

Code: Select all

local function MMacro(m)
  local cas = type(m.key)=="string" and m.key:match("%S+$")
    m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),cas:sub(1,-2),cas:sub(-1))
  return Macro(m)
end
И, во избежание нахлёста хоткеев, во втором случае применения ключа AltShiftS вернулся к его ручному вводу. И получилась следующая картинка меню выбора макроса:
kartinka.png
А нельзя ли в тех строках, в которых запись в description начинается именно на амперсант &, замену предустановленного хоткея не производить и букву в комбинации в правом столбце не подсвечивать? Если только это не слишком усложнило бы функцию.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

sToLp wrote: Thu 06 Dec, 2018 23:05 На текущий момент сделал так:

Code: Select all

local function MMacro(m)
  local cas = type(m.key)=="string" and m.key:match("%S+$")
    m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),cas:sub(1,-2),cas:sub(-1))
  return Macro(m)
end
И, во избежание нахлёста хоткеев, во втором случае применения ключа AltShiftS вернулся к его ручному вводу. И получилась следующая картинка меню выбора макроса: kartinka.png
Вы зря выкинули проверку if cas then, потому что без неё, если key отсутствует, MMacro упадёт в процессе загрузки макросов.
sToLp wrote: Thu 06 Dec, 2018 23:05 А нельзя ли в тех строках, в которых запись в description начинается именно на амперсант &, замену предустановленного хоткея не производить и букву в комбинации в правом столбце не подсвечивать? Если только это не слишком усложнило бы функцию.
См. ниже.
sToLp wrote: Thu 06 Dec, 2018 21:18
Такой способ очень удобен. Ведь если надо просто вызвать меню плагина, то достаточно дважды подряд нажать ключ. Меню выбора проскочит незаметно и практически сразу же будет вызвано меню плагина. Я этот способ практикую во множестве случаев и он вполне себя оправдывает, по моему убеждению.
Мой вариант лучше тем, что, если отсутствует вторая клавиша, то описание выводится без изменений, что позволяет выделять некоторые, скажем, редко используемые, пункты, с помощью оформления. Кстати, очень хорошо подходит для пункта "внутренняя команда Far". И противоречия в ключах (совершенно не нужного и только путающего пользователей) не будет. А второй раз указать клавиатурную комбинацию, если она действительно нужна, нетрудно.
Last edited by IgorZ on Fri 07 Dec, 2018 06:20, 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 »

Небольшое сервисное дополнение.
Данный макрос позволяет нажимать в меню выбора вторую быструю клавишу, не отпуская модификаторы.

Code: Select all

local MSMenuGuid = "165AA6E3-C89B-4F82-A0C5-C309243FD21B"
local mod,k

Macro{
  id="817F6653-F4AC-48DC-809B-7AD94AEFC8EC";
  area="Menu";
  key="/.+/";
  priority=100;
  condition=function(key)
mod,k = key:match("^(.+)(.)$")
return Menu.Id==MSMenuGuid and mod==Object.Title:match(" (%S+)%S$")
  end;
  action=function()
Keys(k)
if Menu.Value:match(mod..k.."$") then
  Keys("Enter")
end
  end;
}
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

И ещё одно соображение. Вторая клавиатурная комбинация в кеу: а нужна ли она там? Ведь, как я понимаю, вся суть данного метода именно в том, чтобы вызывать макросы последовательным нажатием двух комбинаций. И только первая отрабатывается непосредственно Far-ом. Можно было бы ввести для второй комбинации поле key2, из которого бы MMacro брал её, вместо того, чтобы разбирать key. Тогда вторые комбинации освободятся для других макросов (или перестанут перекрывать внутренние команды Far, упрощая доступ к ним).
Варианты MMacro:
Клавиатурная комбинация указывается полностью (key2="AltShiftF";):

Code: Select all

local function MMacro(m)
  if type(m.key2)=="string" then
    m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),m.key2:sub(1,-2),m.key2:sub(-1))
  end
  return Macro(m)
end
Клавиатурная комбинация указывается частично (key2="F";), префикс берётся из key(key="AltShiftS";):

Code: Select all

local function MMacro(m)
  if type(m.key)=="string" and type(m.key2)=="string" then
    m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),m.key:sub(1,-2),m.key2)
  end
  return Macro(m)
end
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 07 Dec, 2018 06:46 И ещё одно соображение.
С полем key2 это Вы шикарно придумали! Большущее спасибо за помощь!

Очевидно, что больше подходит первый вариант:
Клавиатурная комбинация указывается полностью (key2="AltShiftF";):

Code: Select all

local function MMacro(m)
  if type(m.key2)=="string" then
    m.description = ("%-"..width.."s %s&%s"):format(m.description:gsub("&",""),m.key2:sub(1,-2),m.key2:sub(-1))
  end
  return Macro(m)
end
Он предпочтительнее, поскольку позволяет не привязываться жёстко к базовой клавиатурной комбинации, а выводить любую подходящую для конкретно случая, вплоть до того, что можно и просто одиночный хоткей указывать, когда это целесообразно. А также он допускает введение в основном поле key любое количество ключей, в т.ч. невалидных, что также вполне может пригодиться на практике.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

sToLp wrote: Thu 06 Dec, 2018 23:05 local cas = type(m.key)=="string" and m.key:match("%S+$")
Имя переменной cas обозначало набор модификаторов CtrlAltShift, теперь это не так, значит имя стоит изменить.
Тип m.key проверять излишне.
sToLp wrote: Thu 06 Dec, 2018 23:05 m.description:gsub("&","")
А не лучше ли удалить ненужные амперсанды сразу, в исходнике?
Зачем это делать динамически?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

IgorZ wrote: Fri 07 Dec, 2018 06:18 если key отсутствует
key не может отсутствовать.
Если отсутствует, значит и MMacro не надо.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

sToLp wrote: Fri 07 Dec, 2018 08:17 С полем key2 это Вы шикарно придумали! Большущее спасибо за помощь!
А это год назад ещё предлагалось zg: viewtopic.php?p=146604#p146604
Я уж подумал, будто вам удобнее такое дублирование клавиш.

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

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

Post by sToLp »

John Doe wrote: Fri 07 Dec, 2018 08:21
sToLp wrote: Thu 06 Dec, 2018 23:05 local cas = type(m.key)=="string" and m.key:match("%S+$")
Имя переменной cas обозначало набор модификаторов CtrlAltShift, теперь это не так, значит имя стоит изменить.
Да, это я сделаю. Просто пока что не успеваю за обилием Ваших и IgorZ весьма плодотворных идей. За которые я вам безмерно благодарен!
Тип m.key проверять излишне.
Учту, но почему это так, я, к сожалению, пока что не просёк. По-возможности, поясните, пожалуйста, хотя бы чуть подробнее.
John Doe wrote: Fri 07 Dec, 2018 08:21
sToLp wrote: Thu 06 Dec, 2018 23:05 m.description:gsub("&","")
А не лучше ли удалить ненужные амперсанды сразу, в исходнике?
Зачем это делать динамически?
Этого я пока что менять не буду. Сначала какое-то время поупражняюсь на практике. Мне эта возможность нравится на случай если надо будет из этого набора макросов перенимать что-то в другие макросы, в которых может, ведь, MMacro и не применяться. А здесь уже как бы готовые примеры. А могут быть и обратные случаи, когда Macro будет преобразовываться в MMacro и тогда тоже не потребуется лишняя работа. Поэтому данная автоматика мне импонирует.
John Doe wrote: Fri 07 Dec, 2018 08:23
IgorZ wrote: Fri 07 Dec, 2018 06:18 если key отсутствует
key не может отсутствовать.
Если отсутствует, значит и MMacro не надо.
Вот и я сначала примерно так же подумал и убрал проверку. А потом, после справедливого указания от IgorZ, перепроверил и убедился, что при отсутствии ключа MMacro действительно падает. Разумеется, Вы правы, что без ключа MMacro не имеет смысла. Однако, на практике этот принцип временно может и позабыться. Поэтому пусть уж лучше проверка останется, на всякий пожарный.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

sToLp wrote: Fri 07 Dec, 2018 09:10
Тип m.key проверять излишне.
Учту, но почему это так, я, к сожалению, пока что не просёк. По-возможности, поясните, пожалуйста, хотя бы чуть подробнее.
Это вы объясните, для чего проверяете.
sToLp wrote: Fri 07 Dec, 2018 09:10 и убедился, что при отсутствии ключа MMacro действительно падает
То что падает - это разве плохо?
Наоборот, "падает" значит указывает на вашу ошибку.
Пустой key разве может встретиться в макросе, к которому вы применяете MMacro?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

John Doe wrote: Fri 07 Dec, 2018 08:43
sToLp wrote: Fri 07 Dec, 2018 08:17 С полем key2 это Вы шикарно придумали! Большущее спасибо за помощь!
А это год назад ещё предлагалось zg: viewtopic.php?p=146604#p146604
Я уж подумал, будто вам удобнее такое дублирование клавиш.
А я тогда подумал, что это надо специально вводить в luamacro через мантис. И ведь даже виш на эту тему тогда создал (а теперь его, наверное, и закрывать можно, поскольку его реализация возможна и без внесения изменения в код luamacro). А про MMacro я тогда даже и не предполагал. И если бы не Вы и IgorZ, то и по сейчас бы всё ещё застревал бы на том же месте.
При таком раскладе можно это элементарно реализовать прямо в luamacro, ведь горячая клавиша в меню предусмотрена (AccelKey).
Ради Бога, поясните, пожалуйста. И, по возможности бы, на примере.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

John Doe wrote: Fri 07 Dec, 2018 09:29
sToLp wrote: Fri 07 Dec, 2018 09:10
Тип m.key проверять излишне.
Учту, но почему это так, я, к сожалению, пока что не просёк. По-возможности, поясните, пожалуйста, хотя бы чуть подробнее.
Это вы объясните, для чего проверяете.
Увы, сам объяснить пока что не могу. А поскольку код не мой, то и убирать из работающего кода то, что работает, не предполагаю, пока не осознаю что к чему.
sToLp wrote: Fri 07 Dec, 2018 09:10 и убедился, что при отсутствии ключа MMacro действительно падает
То что падает - это разве плохо?
Наоборот, "падает" значит указывает на вашу ошибку.
При создании и отладке макросов это, как правило, очень даже хорошо. Но не абсолютно. Порой надо что-то сделать по-быстрому, а тут вылезает красный тормоз.
Пустой key разве может встретиться в макросе, к которому вы применяете MMacro?
Нечаянно, особенно когда надо преобразовать Macro в MMacro очень даже может. По крайне мере, в моей личной практике. И, вполне возможно, что не способность к полной сосредоточенности, это сугубо моя личная особенность. Хотя подозреваю, что может быть и наоборот и способностью полностью сосредотачиваться обладают лишь не многие.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

sToLp wrote: Fri 07 Dec, 2018 09:49 Порой надо что-то сделать по-быстрому, а тут вылезает красный тормоз.
Вот так по-быстрому сделаете, а вдругой раз час будете искать ошибку.

Красный тормоз он не зря вылазит.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

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

Post by sToLp »

John Doe wrote: Fri 07 Dec, 2018 09:54Вот так по-быстрому сделаете, а в другой раз час будете искать ошибку.

Красный тормоз он не зря вылазит.
Это очень ситуативно. Зачастую прямо сейчас времени в обрез, стресс, а в другой раз и несколько часов порожнего дежурства и тогда времени на поиски ошибки предостаточно.
Post Reply

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