sToLp wrote: ↑Mon 26 Nov, 2018 09:12
Например, редко используемые макросы, справочные макросы и макросы, дублирующие нативные команды Far`а, можно было бы помечать пониженным приоритетом и в нужные моменты оперативно дополнять ими "базовые" меню выбора и также изымать их оттуда.
Замечу, что это возможно реализовать и текущими средствами, использую функцию condition, которая бы изменяла приоритет в зависимости от некоторого внешнего флага.
Поведение, когда нужно сделать выбор из нескольких макросов
Posted: Wed 28 Nov, 2018 14:12
by sToLp
Latest post of the previous page:
Shmuel wrote: ↑Wed 28 Nov, 2018 13:16sToLp, Что у вас монитор такой шикарный или свёрткой в редакторе пользуетесь?
И то — вот сейчас под рукой старый 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
Подумаю и попытаюсь, но не уверен, что это у меня получится.
Однако вы нигде не описываете идею в целом, а без этого сходу может быть сложно понять суть и смысл отдельных ваших предложений.
Итак, возьму на себя попытку описать идею целиком, а вы поправьте если что.
Проблема: удобных кнопкосочетаний всегда не хватает, а при большом количестве команд (полезных, но не каждый день используемых) их и запомнить проблематично, и поэтому всё равно приходится открывать макробраузер, и искать их.
Решение: сгруппировать связанные команды в набор меню, уменьшив таким образом количество основных кнопкосочетаний.
Команды при этом могут вызываться:
любая команда представляет собой полноценный макрос, поэтому может быть вызвана и без меню (если снабжена отдельным кнопкосочетанием)
Реализация: меню для команд создать можно разными способами, используя Menu.Show или far.Menu, однако был выбран другой способ: использовать штатное меню конфликта макросов, выводимое в случае когда на заданное кнопкосочетание существует несколько макросов.
Преимущества именно такого подхода:
Возможность создания динамических контекстных меню, пункты к которые включаются в зависимости от определённых условий (area/priority/condition).
Отдельные команды одного меню получаются независимы, и могут определяться в разных макрофайлах.
Создание такого меню может быть проще для пользователя, поскольку само меню программировать как-бы не требуется.
Меню конфликта как средство организации макросов
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; это работает не так, как вам хотелось. Необходимо объединить в одну функцию.
----------------------------------------------------------------------------------------------
-- Макросы для работы с плагином LuaFAR Search (shmuel) в редакторе.
-- Использован концепт специфического применения функции condition, автор которого:
-- John Doe Tue 27 Nov 2018 12:00 https://forum.farmanager.com/viewtopic.php?p=151767#p151767
-- Концепт обеспечивает оперативное включение/выключение показа макросов с пониженным priority
-- Для переключения между вариантами меню следует нажимать Shift дважды подряд: клац-клац
----------------------------------------------------------------------------------------------
local Guid = "8E11EA75-0303-4374-AC60-D1E38F865449"
local function LFS_Editor(...) Plugin.Call(Guid, "own", "editor", ...) end
--local function LFS_Panels(...) Plugin.Call(Guid, "own", "panels", ...) end
local function LFS_Exist() return Plugin.Exist(Guid) end
--концепт:
local fullmenu
local function LFS_condition(...) return LFS_Exist(...) and (fullmenu and 100 or true) end
--John Doe Wed 28 Nov 2018 19:28 https://forum.farmanager.com/viewtopic.php?p=151808#p151808
-- двойное нажатие: John Doe Wed 13 Jul 2016 19:50 http://forum.farmanager.com/viewtopic.php?p=139385#p139385
local maxDelay = 500 -- промежуток времени между двумя нажатиями пусковой клавиши (в миллисекундах)
local t = 0
local ID = "165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- гуид меню выбора макросов
Macro {
area="Menu"; priority = 100; key="Shift";
description="ВКЛ/ВЫКЛ показ макросов с уменьшенным приоритетом (поJD) двойнойShift";
id="F484EA2A-D1F1-4601-9CD3-B758009A07EA";
condition=function()
if Menu.Id=="165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- вызов макроса только из меню выбора макросов (запущенного из
-- любой макрообласти)
then
-- далее condition обеспечивает срабатывание пускового ключа ("Shift") на двойное нажатие:
local t1 = Far.UpTime
local delay = t1-t
t = t1
return Menu.Id==ID and delay<maxDelay
end
end;
action=function()
fullmenu = not fullmenu
--переключатель повышения до 100 и возврата до установленных величин приоритетов макросов:
--John Doe Tue 27 Nov 2018 12:00 https://forum.farmanager.com/viewtopic.php?p=151767#p151767
--John Doe Wed 28 Nov 2018 18:23 https://forum.farmanager.com/viewtopic.php?p=151804#p151804
local rbnd=Object.Title:match": (.+)$"
--msgbox("Область, из которой вызвано меню,\nи ключ, которым оно вызвано:\n",rbnd,0x00010000)
local bndf=Object.Title:match"| (.+)$" --msgbox("Полный ключ, которым вызвано меню:",bndf,0x00010000)
local mrgn=mf.replace(rbnd," | "..bndf,"") --msgbox("Область, из которой вызвано меню:",mrgn,0x00010000)
Keys("F10") --msgbox("Вышли из меню?","Да",0x00010000)
eval(mrgn.."/"..bndf,2) --msgbox("Возвращались в меню?","Да",0x00010000)
end;
}
Macro {
description="LuaFAR Search: Editor &Find-поиск (shmuel) AltShiftF";
-- ключ AltShiftF занят системной (?) командой
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftF"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "search" end
}
Macro {
description="LuaFAR Search: Editor &Replace-замена (shmuel) AltShiftR";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftR"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "replace" end
}
Macro {
description="LuaFAR Search: Editor Rep&Eat-повторить (shmuel) AltShiftE";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftE"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "repeat" end
}
Macro {
description="LuaFAR Search: Editor Repeat re&Verse (shmuel) CtrlShiftE";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS CtrlShiftE"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "repeat_rev" end
}
Macro {
description="LuaFAR Search: Editor искать &Word-слово (shmuel) AltShiftW";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftW"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "searchword" end
}
Macro {
description="LuaFAR Search: Editor искать w&Ord назад (shmuel) CtrlShiftW";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS CtrlShiftW"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "searchword_rev" end
}
-- Uncomment this macro if it is needed.
-- Раскомментировать этот макрос нет необходимости, поскольку макрос переключения подсветку сбрасывает
--Macro {
----description="LuaFAR Search: Reset Highlight (shmuel) CtrlShiftH";
--description="LuaFAR Search: сбросить подсветку (shmuel) CtrlShiftH";
-- area="Editor"; key="AltShiftS CtrlShiftH"; condition=LFS_Exist;
-- action = function() LFS_Editor "resethighlight" end
--}
Macro {
--description="LuaFAR Search: Toggle Highlight (shmuel) AltShiftH";
description="LuaFAR Search: вкл/выкл доп&Highlight (shmuel) AltShiftH";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftH"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "togglehighlight" end
}
Macro {
description="LuaFAR Search: Editor Multi-&Line replace (shmuel) AltShiftL";
area="Editor"; filemask="*.*|*.tmpg"; key="AltShiftS AltShiftL"; condition=LFS_condition; ---condition=LFS_Exist and isFullMenu;
action = function() LFS_Editor "mreplace" end
}
-- следующий макрос переделан из макроса, ранее взятого из сборки Victor_VG на руборде
-- http://forum.ru-board.com/topic.cgi?forum=5&topic=49572&start=0&limit=1&m=2#1
Macro {
description="LuaFAR Search: Editor МЕНЮ ПЛАГИНА AltShiftS";--77без&
area="Editor"; key="AltShiftS"; selected=true;
condition=LFS_condition; ---condition=isFullMenu;
action=function() Plugin.Menu(Guid) end;
}
local function isFullMenu()
return fullmenu and 100 or true
end
-- ПОДВАЛьные макросы:
--сначала блок из двух макросов работы с результатами Грепа авторства Алексис21
--Alexyz21 16:41 09-11-2018 http://forum.ru-board.com/topic.cgi?forum=5&topic=49572&start=1200#16
Macro {
area="Editor"; --filemask="*.tmpg";
key="AltShiftS AltShiftA"; flags=""; sortpriority=6; priority=40;
--description="RESearch: 2. Grep Save line";
description="edi: Grep &A): сохранить изменённую строку (Alexyz21) AltShiftA"; --78c&
--condition=function() return editor.GetInfo(-1).FileName:match('\\%w-%.tmp$') end;
--комментарий sToLp: пользователь вправе сохранить результаты грепа в любой файл и поэтому ограничивать работу макроса
--только .tmp-файлами излишне
condition=isFullMenu;
action=function()
local f,l,y,x,p,n,s = GInfo()
if n then
editor.SetPosition(-1,y,x,_,_,p)
if f then
editor.Editor(f,_,_,_,_,_,bit64.bor(F.EF_NONMODAL,F.EF_IMMEDIATERETURN,F.EF_OPENMODE_USEEXISTING),tonumber(n),x-#n-1)
editor.SetString(-1,n,s)
if not editor.SaveFile(-1) then msgbox("Warning! File is not saved - blocked?",f) else editor.Quit(-1) end
end
end
end;
}
Macro {
area="Editor"; --filemask="*.tmpg";
key="AltShiftS AltShiftB"; flags=""; sortpriority=5; priority=40;
--description="RESearch: 3. Grep Save All";
description="edi: Grep &B): сохранить все изменения (Alexyz21) AltShiftB"; --78c&
--condition=function() return editor.GetInfo(-1).FileName:match('\\%w-%.tmp$') end;
--комментарий sToLp: пользователь вправе сохранить результаты грепа в любой файл и поэтому ограничивать работу макроса
--только .tmp-файлами излишне
condition=isFullMenu;
action=function()
local t={}
for i=1,editor.GetInfo(-1).TotalLines do
local l=editor.GetString(-1,i).StringText
local y,s = l:match('^(%d-)[-:](.+)$')
if y and s and #t>=1
then table.insert(t,{y,s})
else
local f=GetFileName(l)
if f then
if #t>1 then FileSave(t) t={} end
t[1]={f,nil}
end
end
end
if #t>1 then FileSave(t) end
end;
}
--а теперь макрос-индикатор наличия нативной команды Far`а, назначенной на ключ, общий для всех маросов данной подборки:
Macro {
area="Editor"; key="AltShiftS"; priority=40;
description="&Native: внутренняя команда Far не назначена AltShiftS";
id="11000C83-734C-4A71-8F2D-04BA2D747541"; sortpriority=1;
flags="NoPluginPanels EmptyCommandLine";
condition=isFullMenu;
action=function()
local cmd = far.Message(
"Нативная (внутренняя) команда Far на ключ AltShiftS не назначена.\n\nДа -- продолжить. Нет -- вернуться в меню.",
"ВНИМАНИЕ !",";YesNo")
if cmd==1 then Keys("AltShiftS")
end
if cmd==2 then eval("Editor/AltShiftS",2)
end
end;
}
. А
John Doe wrote: ↑Wed 28 Nov, 2018 18:23
3. Если вы хотите использовать тот же подход в другом макрофайле, то как уже говорилось выше, необходимы изменения (глобальная переменная либо модуль).
John Doe wrote: ↑Wed 28 Nov, 2018 19:28 В простейшем случае вместо local fullmenu можно не объявлять, а макросе-переключателе адресовать переменную из _G: _G.fullmenu = not fullmenu.
попытаюсь внести попозже.
Меню конфликта как средство организации макросов
Posted: Fri 30 Nov, 2018 18:17
by sToLp
John Doe wrote: ↑Tue 27 Nov, 2018 14:16
дублировать весь код дважды это не годится, когда можно запросто автоматизировать:
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
А не могли бы Вы для того, чтобы не нужно было вставлять этот макрос в каждый файл, преобразовать его в модуль?
В данном случае функция достаточно проста, чтобы прямо так вставлять в каждый файл.
Потому что использование из модуля тоже займёт строчку:
sToLp wrote: ↑Thu 29 Nov, 2018 19:28
Собственно я бы скорее называл это не идеей, а подходом, способом или методом.
Возвращаясь к самому подходу.
Сейчас вы сразу привязываете пункт меню к конкретной клавише, в примерах выше это "AltShiftS".
А я бы вместо этого использовал бы "псевдоклавишу", название данного меню, например "LFSearch".
И уже потом привязал бы к клавише: