Меню конфликта как средство организации макросов

Здесь обсуждается всё, что касается макросов.
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: Mon 26 Nov, 2018 09:12 Например, редко используемые макросы, справочные макросы и макросы, дублирующие нативные команды Far`а, можно было бы помечать пониженным приоритетом и в нужные моменты оперативно дополнять ими "базовые" меню выбора и также изымать их оттуда.
Замечу, что это возможно реализовать и текущими средствами, использую функцию condition, которая бы изменяла приоритет в зависимости от некоторого внешнего флага.
 ! Message from: John Doe
Начало обсуждения см. в теме Поведение, когда нужно сделать выбор из нескольких макросов
Last edited by John Doe on Thu 29 Nov, 2018 13:48, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поведение, когда нужно сделать выбор из нескольких макросов

Post by Shmuel »

Latest post of the previous page:

sToLp, вот мне непонятно, почему вы (и некоторые другие) делаете в своих файлах строки длиной 280 символов или больше. Что у вас монитор такой шикарный или свёрткой в редакторе пользуетесь?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Поведение, когда нужно сделать выбор из нескольких макросов

Post by sToLp »

Shmuel wrote: Wed 28 Nov, 2018 13:16 sToLp, Что у вас монитор такой шикарный или свёрткой в редакторе пользуетесь?
И то — вот сейчас под рукой старый Philips 298X4 29” (а периодически могут быть и намного лучше), и другое — изредка плагин EditWrap с его штатным макросом, а также, пожалуй, и третье — привычка, и четвёртое — отсутствие поводов делать иначе. И поэтому если Вы порекомендуете какой максимальной длины должны быть строки, то, полагаю, что сумею приноровиться.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Поведение, когда нужно сделать выбор из нескольких макросов

Post by Shmuel »

sToLp wrote: Wed 28 Nov, 2018 14:12 если Вы порекомендуете какой максимальной длины должны быть строки
Нет, в данном случае ничего не порекомендую, мне просто было любопытно.
Но раз уже вы спросили - я стараюсь не превышать длину 120 символов.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Поведение, когда нужно сделать выбор из нескольких макросов

Post by zg »

Shmuel wrote: Wed 28 Nov, 2018 13:16Что у вас монитор такой шикарный
на fullhd при шрифте consolas 16 влезает 238 колонок. ничего шикарного.
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: Wed 28 Nov, 2018 13:00 получился-таки вполне и практически применимый вариант вывода в меню выбора макросов макросов с пониженным приоритетом.
У вас тут не всё хорошо.

1. Макрос Common/Shift как отдельный врядли нужен, лучше включите его в ваш Menu/Shift
2. condition=LFS_Exist and isFullMenu; это работает не так, как вам хотелось. Необходимо объединить в одну функцию.
3. Если вы хотите использовать тот же подход в другом макрофайле, то как уже говорилось выше, необходимы изменения (глобальная переменная либо модуль).
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: Wed 28 Nov, 2018 19:02 Подумаю и попытаюсь, но не уверен, что это у меня получится.
Да что там пытаться.

Code: Select all

local function LFS_condition(...) return LFS_Exist(...) and (fullmenu and 100 or true) end
sToLp wrote: Wed 28 Nov, 2018 19:02 А вот по этому пункту без Вашей помощи я точно пока что ни чего не смогу сделать,
В простейшем случае вместо local fullmenu можно не объявлять, а макросе-переключателе адресовать переменную из _G: _G.fullmenu = not fullmenu.
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, начал проникаться вашей идеей, и поэтому выделил часть обсуждения в собственную тему (эту).
Это конечно условно, поскольку идея всплывала и ранее, см. Поведение, когда нужно сделать выбор из нескольких макросов.

Однако вы нигде не описываете идею в целом, а без этого сходу может быть сложно понять суть и смысл отдельных ваших предложений.

Итак, возьму на себя попытку описать идею целиком, а вы поправьте если что.

Проблема: удобных кнопкосочетаний всегда не хватает, а при большом количестве команд (полезных, но не каждый день используемых) их и запомнить проблематично, и поэтому всё равно приходится открывать макробраузер, и искать их.

Решение: сгруппировать связанные команды в набор меню, уменьшив таким образом количество основных кнопкосочетаний.
Команды при этом могут вызываться:
  1. выбором из меню
  2. хоткеем из меню, в частности — последовательностями (Запуск макросов кнопкосочетаниями, через меню конфликта макросов )
  3. любая команда представляет собой полноценный макрос, поэтому может быть вызвана и без меню (если снабжена отдельным кнопкосочетанием)
Реализация: меню для команд создать можно разными способами, используя Menu.Show или far.Menu, однако был выбран другой способ: использовать штатное меню конфликта макросов, выводимое в случае когда на заданное кнопкосочетание существует несколько макросов.
Преимущества именно такого подхода:
  1. Возможность создания динамических контекстных меню, пункты к которые включаются в зависимости от определённых условий (area/priority/condition).
  2. Отдельные команды одного меню получаются независимы, и могут определяться в разных макрофайлах.
  3. Создание такого меню может быть проще для пользователя, поскольку само меню программировать как-бы не требуется.
tstr
Posts: 557
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 20 times
Been thanked: 9 times

Меню конфликта как средство организации макросов

Post by tstr »

есть ещё идея по “отсечению” автоназначения/срабатывания хоткеев в списке ниже видимых/невидимых разделителей (по флагу, например как разделители в пользовательском меню — "--:" - видимый, а "---:" - невидимый) списка элементов — снимаем проблему запоминания не часто нужных и совместно с приоритетом в сортировке - компонуем в группы, не привязываясь к стандартным настройкам и содержанию макросов. сохраняем обратную совместимость.
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: Thu 29 Nov, 2018 14:32 возьму на себя попытку описать идею целиком
Собственно я бы скорее называл это не идеей, а подходом, способом или методом. И Вы, на мой взгляд, весьма цельно ухватили и верно охарактеризовали аспекты практикуемого мною подхода к формированию удобных для повседневного использования меню запуска макросов с помощью замечательного инструмента — меню выбора макроса. И Проблему, и Решение, и Реализацию. За что я Вам очень признателен.

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 »

tstr, не очень понял, проиллюстрируйте кодом
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 29 Nov, 2018 19:28 Со своей стороны я бы отметил лишь один, но существенный, по моему убеждению, нюанс. Весьма желательно используемый инструмент называть не "меню конфликта", а "меню выбора", что более соответствует его сути и наименованию, указанному в справке. Вплоть до того, что просил бы Вас изменить это и в названии темы.
В фаре подобные меню выводятся в нескольких случаях: несколько плагинов претендуют на один файл, маски несколько ассоциаций подходят к запускаемому файлу, и наконец несколько макросов с равным приоритетом.
Традиционно эти меню назывались на форуме "меню конфликта", поскольку это однозначно даёт понять о чём идёт речь.
"Меню выбора" это тоже верно, но менее информативно, поскольку "выбор" доступен в очень большом количестве мест.

С точки зрения вашего подхода действительно одноимённые клавиши задаются намеренно, чтобы создать список, из которого пользователь сделает выбор.
Однако список строится вполне конкретным способом, используя встроенную функциональность, и я посчитал важным в названии темы именно это подчеркнуть.
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: Wed 28 Nov, 2018 18:23 1. Макрос Common/Shift как отдельный врядли нужен, лучше включите его в ваш Menu/Shift
2. condition=LFS_Exist and isFullMenu; это работает не так, как вам хотелось. Необходимо объединить в одну функцию.
John Doe wrote: Wed 28 Nov, 2018 19:28

Code: Select all

local function LFS_condition(...) return LFS_Exist(...) and (fullmenu and 100 or true) end
Изменения по этим рекомендациям внёс так, как сумел их понять. Главное, что концепт . А попытаюсь внести попозже.
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: Tue 27 Nov, 2018 14:16 дублировать весь код дважды это не годится, когда можно запросто автоматизировать:

Code: Select all

local function MMacro(m)
  m.key = m.key:gsub("%S+","%0 _%0")
  return Macro(m)
end
После чего все определения, в которые нужно добавить псевдоклавши, можно сделать заменив 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 30 Nov, 2018 18:17 А не могли бы Вы для того, чтобы не нужно было вставлять этот макрос в каждый файл, преобразовать его в модуль?
В данном случае функция достаточно проста, чтобы прямо так вставлять в каждый файл.
Потому что использование из модуля тоже займёт строчку:

Code: Select all

local Macro = require"stolps".MMacro(Macro)
  1. -- не тестировал
  2.  
  3. local M = {}
  4.  
  5.  
  6.  
  7. function M.MMacro(Macro)
  8.  
  9.   return function(m)
  10.  
  11.     m.key = m.key:gsub("%S+","%0 _%0")
  12.  
  13.     return Macro(m)
  14.  
  15.   end
  16.  
  17. end
  18.  
  19.  
  20.  
  21. return M
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 29 Nov, 2018 19:28 Собственно я бы скорее называл это не идеей, а подходом, способом или методом.
Возвращаясь к самому подходу.
Сейчас вы сразу привязываете пункт меню к конкретной клавише, в примерах выше это "AltShiftS".
А я бы вместо этого использовал бы "псевдоклавишу", название данного меню, например "LFSearch".
И уже потом привязал бы к клавише:

Code: Select all

Macro { description="LFSearch actions menu";
  area="Editor"; key="AltShiftS";
  action=function()
    mf.eval("LFSearch",2)
  end;
}
Преимущества: легче сменить клавишу, плюс (идеологически) в каждом отдельном макросе сразу подчёркивается его принадлежность к меню.
Post Reply

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