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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 12075
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 28 times
Been thanked: 152 times

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

Post by John Doe » Mon 26 Nov, 2018 12:18

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.

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

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

Post by sToLp » Wed 28 Nov, 2018 14:12

Latest post of the previous page:

Shmuel wrote:
Wed 28 Nov, 2018 13:16
sToLp, Что у вас монитор такой шикарный или свёрткой в редакторе пользуетесь?
И то — вот сейчас под рукой старый Philips 298X4 29” (а периодически могут быть и намного лучше), и другое — изредка плагин EditWrap с его штатным макросом, а также, пожалуй, и третье — привычка, и четвёртое — отсутствие поводов делать иначе. И поэтому если Вы порекомендуете какой максимальной длины должны быть строки, то, полагаю, что сумею приноровиться.

Shmuel
Posts: 5608
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 186 times

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

Post by Shmuel » Wed 28 Nov, 2018 14:20

sToLp wrote:
Wed 28 Nov, 2018 14:12
если Вы порекомендуете какой максимальной длины должны быть строки
Нет, в данном случае ничего не порекомендую, мне просто было любопытно.
Но раз уже вы спросили - я стараюсь не превышать длину 120 символов.

User avatar
zg
zero-gravity
Posts: 5520
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 83 times
Contact:

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

Post by zg » Wed 28 Nov, 2018 16:15

Shmuel wrote:
Wed 28 Nov, 2018 13:16
Что у вас монитор такой шикарный
на fullhd при шрифте consolas 16 влезает 238 колонок. ничего шикарного.

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

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

Post by John Doe » Wed 28 Nov, 2018 18:23

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

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

Post by John Doe » Wed 28 Nov, 2018 19:28

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

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

Post by John Doe » Thu 29 Nov, 2018 14:32

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

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

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

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

Решение: сгруппировать связанные команды в набор меню, уменьшив таким образом количество основных кнопкосочетаний.
Команды при этом могут вызываться:
  1. выбором из меню
  2. хоткеем из меню, в частности — последовательностями (Запуск макросов кнопкосочетаниями, через меню конфликта макросов )
  3. любая команда представляет собой полноценный макрос, поэтому может быть вызвана и без меню (если снабжена отдельным кнопкосочетанием)
Реализация: меню для команд создать можно разными способами, используя Menu.Show или far.Menu, однако был выбран другой способ: использовать штатное меню конфликта макросов, выводимое в случае когда на заданное кнопкосочетание существует несколько макросов.
Преимущества именно такого подхода:
  1. Возможность создания динамических контекстных меню, пункты к которые включаются в зависимости от определённых условий (area/priority/condition).
  2. Отдельные команды одного меню получаются независимы, и могут определяться в разных макрофайлах.
  3. Создание такого меню может быть проще для пользователя, поскольку само меню программировать как-бы не требуется.

tstr
Posts: 522
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 7 times
Been thanked: 6 times

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

Post by tstr » Thu 29 Nov, 2018 14:52

есть ещё идея по “отсечению” автоназначения/срабатывания хоткеев в списке ниже видимых/невидимых разделителей (по флагу, например как разделители в пользовательском меню — "--:" - видимый, а "---:" - невидимый) списка элементов — снимаем проблему запоминания не часто нужных и совместно с приоритетом в сортировке - компонуем в группы, не привязываясь к стандартным настройкам и содержанию макросов. сохраняем обратную совместимость.

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

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

Post by sToLp » Thu 29 Nov, 2018 19:28

John Doe wrote:
Thu 29 Nov, 2018 14:32
возьму на себя попытку описать идею целиком
Собственно я бы скорее называл это не идеей, а подходом, способом или методом. И Вы, на мой взгляд, весьма цельно ухватили и верно охарактеризовали аспекты практикуемого мною подхода к формированию удобных для повседневного использования меню запуска макросов с помощью замечательного инструмента — меню выбора макроса. И Проблему, и Решение, и Реализацию. За что я Вам очень признателен.


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

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

Post by John Doe » Fri 30 Nov, 2018 08:47

tstr, не очень понял, проиллюстрируйте кодом

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

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

Post by John Doe » Fri 30 Nov, 2018 09:10

sToLp wrote:
Thu 29 Nov, 2018 19:28
Со своей стороны я бы отметил лишь один, но существенный, по моему убеждению, нюанс. Весьма желательно используемый инструмент называть не "меню конфликта", а "меню выбора", что более соответствует его сути и наименованию, указанному в справке. Вплоть до того, что просил бы Вас изменить это и в названии темы.
В фаре подобные меню выводятся в нескольких случаях: несколько плагинов претендуют на один файл, маски несколько ассоциаций подходят к запускаемому файлу, и наконец несколько макросов с равным приоритетом.
Традиционно эти меню назывались на форуме "меню конфликта", поскольку это однозначно даёт понять о чём идёт речь.
"Меню выбора" это тоже верно, но менее информативно, поскольку "выбор" доступен в очень большом количестве мест.

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

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

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

Post by sToLp » Fri 30 Nov, 2018 16:14

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

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

Post by sToLp » Fri 30 Nov, 2018 18:17

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

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

Post by John Doe » Sat 01 Dec, 2018 10:16

sToLp wrote:
Fri 30 Nov, 2018 18:17
А не могли бы Вы для того, чтобы не нужно было вставлять этот макрос в каждый файл, преобразовать его в модуль?
В данном случае функция достаточно проста, чтобы прямо так вставлять в каждый файл.
Потому что использование из модуля тоже займёт строчку:

Code: Select all

local Macro = require"stolps".MMacro(Macro)
  1. -- не тестировал
  2. local M = {}
  3.  
  4. function M.MMacro(Macro)
  5.   return function(m)
  6.     m.key = m.key:gsub("%S+","%0 _%0")
  7.     return Macro(m)
  8.   end
  9. end
  10.  
  11. return M

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

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

Post by John Doe » Sat 01 Dec, 2018 15:42

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 “Обсуждение макросов”