Page 2 of 2

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

Posted: Mon 26 Nov, 2018 12:18
by John Doe
sToLp wrote: Mon 26 Nov, 2018 09:12 Например, редко используемые макросы, справочные макросы и макросы, дублирующие нативные команды Far`а, можно было бы помечать пониженным приоритетом и в нужные моменты оперативно дополнять ими "базовые" меню выбора и также изымать их оттуда.
Замечу, что это возможно реализовать и текущими средствами, использую функцию condition, которая бы изменяла приоритет в зависимости от некоторого внешнего флага.
 ! Message from: John Doe
Начало обсуждения см. в теме Поведение, когда нужно сделать выбор из нескольких макросов

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

Posted: Wed 28 Nov, 2018 14:12
by sToLp

Latest post of the previous page:

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

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

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

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

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

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

Posted: Wed 28 Nov, 2018 18:23
by John Doe
sToLp wrote: Wed 28 Nov, 2018 13:00 получился-таки вполне и практически применимый вариант вывода в меню выбора макросов макросов с пониженным приоритетом.
У вас тут не всё хорошо.

1. Макрос Common/Shift как отдельный врядли нужен, лучше включите его в ваш Menu/Shift
2. condition=LFS_Exist and isFullMenu; это работает не так, как вам хотелось. Необходимо объединить в одну функцию.
3. Если вы хотите использовать тот же подход в другом макрофайле, то как уже говорилось выше, необходимы изменения (глобальная переменная либо модуль).

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

Posted: Wed 28 Nov, 2018 19:28
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.

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

Posted: Thu 29 Nov, 2018 14:32
by John Doe
sToLp, начал проникаться вашей идеей, и поэтому выделил часть обсуждения в собственную тему (эту).
Это конечно условно, поскольку идея всплывала и ранее, см. Поведение, когда нужно сделать выбор из нескольких макросов.

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

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

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

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

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

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

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

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


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

Posted: Fri 30 Nov, 2018 08:47
by John Doe
tstr, не очень понял, проиллюстрируйте кодом

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

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

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

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

Posted: Fri 30 Nov, 2018 16:14
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
Изменения по этим рекомендациям внёс так, как сумел их понять. Главное, что концепт . А попытаюсь внести попозже.

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

Posted: Fri 30 Nov, 2018 18:17
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.
Да, действительно, так существенно удобнее и быстрее.
Благодарю Вас за то, что познакомили с таким полезным методом!
А не могли бы Вы для того, чтобы не нужно было вставлять этот макрос в каждый файл, преобразовать его в модуль? Сам-то я с этим делом пока что не справлюсь.

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

Posted: Sat 01 Dec, 2018 10:16
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

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

Posted: Sat 01 Dec, 2018 15:42
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;
}
Преимущества: легче сменить клавишу, плюс (идеологически) в каждом отдельном макросе сразу подчёркивается его принадлежность к меню.