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

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

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

Post by sToLp » Thu 06 Dec, 2018 23:05

Latest post of the previous page:

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

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: 566
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 31 times

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

Post by IgorZ » Fri 07 Dec, 2018 06:18

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: 566
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 31 times

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

Post by IgorZ » Fri 07 Dec, 2018 06:23

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

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: 566
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 31 times

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

Post by IgorZ » Fri 07 Dec, 2018 06:46

И ещё одно соображение. Вторая клавиатурная комбинация в кеу: а нужна ли она там? Ведь, как я понимаю, вся суть данного метода именно в том, чтобы вызывать макросы последовательным нажатием двух комбинаций. И только первая отрабатывается непосредственно 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: 921
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 105 times
Been thanked: 8 times

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

Post by sToLp » Fri 07 Dec, 2018 08:17

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: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » 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, теперь это не так, значит имя стоит изменить.
Тип m.key проверять излишне.
sToLp wrote:
Thu 06 Dec, 2018 23:05
m.description:gsub("&","")
А не лучше ли удалить ненужные амперсанды сразу, в исходнике?
Зачем это делать динамически?

User avatar
John Doe
Бюрократ
Posts: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Fri 07 Dec, 2018 08:23

IgorZ wrote:
Fri 07 Dec, 2018 06:18
если key отсутствует
key не может отсутствовать.
Если отсутствует, значит и MMacro не надо.

User avatar
John Doe
Бюрократ
Posts: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Fri 07 Dec, 2018 08:43

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

При таком раскладе можно это элементарно реализовать прямо в luamacro, ведь горячая клавиша в меню предусмотрена (AccelKey).

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

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

Post by sToLp » Fri 07 Dec, 2018 09:10

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: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » 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?

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

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

Post by sToLp » Fri 07 Dec, 2018 09:30

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: 921
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 105 times
Been thanked: 8 times

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

Post by sToLp » Fri 07 Dec, 2018 09:49

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: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Fri 07 Dec, 2018 09:54

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

Красный тормоз он не зря вылазит.

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

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

Post by sToLp » Fri 07 Dec, 2018 10:02

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

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

User avatar
John Doe
Бюрократ
Posts: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Fri 07 Dec, 2018 10:18

Если хотите я могу вам вообще "красный тормоз" отключить, глобально.
Будете включать обратно только во время дежурства ;-)

Ну а если серьёзно, то ошибка затронет один файл, и срочности в её устранении в общем нет.
И как по мне, то пусть лучше она маячит перед глазами при загрузке макросов, чем забыть о ней совсем.

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

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

Post by IgorZ » Fri 07 Dec, 2018 10:34

По поводу проверки m.key: из двух предложенных мной вариантов sToLp выбрал первый, в котором данной проверки нет. Так что обсуждение данного вопроса неактуально. А вообще, все, казалось бы, избыточные проверки вставлялись мной с далеко идущей целью: в конечном итоге переопределять Macro в _macroinit.lua, чтобы не надо было переправлять Macro на MMacro. Тогда функции понадобится универсальность. Но в принятой sToLp редакции, как я уже заметил, есть только проверка на наличие и корректный тип поля key2.
Last edited by IgorZ on Fri 07 Dec, 2018 10:35, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12072
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Fri 07 Dec, 2018 11:26

IgorZ wrote:
Fri 07 Dec, 2018 10:34
Тогда функции понадобится универсальность.
Верно, тогда понадобилась бы.
В своё время планировал переделать модуль rebind, выделив из него части, которые отвечают собственно за переопределение, а сами переопределяемые функции сделать суб-модулями, предусмотрев возможность каскадного их вызова.

Таким образом было бы удобно совмещать независимые функции, и чуть ли не на лету расширять возможности загрузчика макросов.
А разнообразных идей в какую сторону расширять уже немало было на форуме.

Post Reply

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