Page 3 of 8

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

Posted: Thu 06 Dec, 2018 23:05
by sToLp

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 начинается именно на амперсант &, замену предустановленного хоткея не производить и букву в комбинации в правом столбце не подсвечивать? Если только это не слишком усложнило бы функцию.

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

Posted: Fri 07 Dec, 2018 06:18
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". И противоречия в ключах (совершенно не нужного и только путающего пользователей) не будет. А второй раз указать клавиатурную комбинацию, если она действительно нужна, нетрудно.

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

Posted: Fri 07 Dec, 2018 06:23
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;
}

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

Posted: Fri 07 Dec, 2018 06:46
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

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

Posted: Fri 07 Dec, 2018 08:17
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 любое количество ключей, в т.ч. невалидных, что также вполне может пригодиться на практике.

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

Posted: Fri 07 Dec, 2018 08:21
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("&","")
А не лучше ли удалить ненужные амперсанды сразу, в исходнике?
Зачем это делать динамически?

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

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

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

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

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

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

Posted: Fri 07 Dec, 2018 09:10
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 не имеет смысла. Однако, на практике этот принцип временно может и позабыться. Поэтому пусть уж лучше проверка останется, на всякий пожарный.

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

Posted: Fri 07 Dec, 2018 09:29
by John Doe
sToLp wrote: Fri 07 Dec, 2018 09:10
Тип m.key проверять излишне.
Учту, но почему это так, я, к сожалению, пока что не просёк. По-возможности, поясните, пожалуйста, хотя бы чуть подробнее.
Это вы объясните, для чего проверяете.
sToLp wrote: Fri 07 Dec, 2018 09:10 и убедился, что при отсутствии ключа MMacro действительно падает
То что падает - это разве плохо?
Наоборот, "падает" значит указывает на вашу ошибку.
Пустой key разве может встретиться в макросе, к которому вы применяете MMacro?

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

Posted: Fri 07 Dec, 2018 09:30
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).
Ради Бога, поясните, пожалуйста. И, по возможности бы, на примере.

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

Posted: Fri 07 Dec, 2018 09:49
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 очень даже может. По крайне мере, в моей личной практике. И, вполне возможно, что не способность к полной сосредоточенности, это сугубо моя личная особенность. Хотя подозреваю, что может быть и наоборот и способностью полностью сосредотачиваться обладают лишь не многие.

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

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

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

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

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

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

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

Posted: Fri 07 Dec, 2018 10:18
by John Doe
Если хотите я могу вам вообще "красный тормоз" отключить, глобально.
Будете включать обратно только во время дежурства ;-)

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

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

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