Code: Select all
Macro {
area="shell"; key="F2"; key2="F2";
description="&Native: Меню пользователя (userМенЮ)";
id="85D4EA9D-272A-43BF-9461-09DE9D1C52C6";
sortpriority=100; flags="NoPluginPanels EmptyCommandLine";
action=function()
Keys"F2"
end;
}
-- "2. UserМенЮ: ближайшее (jd) F3":
local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
local nfo = Info { _filename or ...,
name = "Макрос 'UserMenЮ Перезагрузка' (jd)"; -- name = "UserMenu Reloaded";
description = "";--todo
version = "0.2"; --http://semver.org/lang/ru/
author = "jd";
url = "";--todo
id = "10A7C574-2177-44E4-B928-5D9EAE9C2B67";
minfarversion = {3,0,0,5106,0};
help = function(nfo) far.Message(nfo.helpstr,nfo.name,nil,"l") end;
--disabled = false;
options = {
ShowMenuListKey = "CtrlShift2 CtrlShiftF2", -- ShowMenuListKey = "CtrlShiftF2 ShiftF2:Hold",
MenusMask = "*FarMenu*", -- MenusMask = "*.*", -- в именах юзерМеню sToLp`а всегда присутствует фрагмент FarMenu
LocalMask = "*FarMenu*ini", -- LocalMask = "FarMenu*ini",
};
}
if not nfo or nfo.disabled then return end
local O = nfo.options
if not panel.CheckPanelsExist() then return end --https://bugs.farmanager.com/view.php?id=2986
nfo.helpstr = [[
Традиционно местные (локальные) меню используются для того чтобы задать перечень команд, актуальных только для данной конкретной папки.
Но как быть если те же команды требуются и во всех вложенных папках?
В зачаточной форме фар предусматривает определённые средства: переход по BS (Backspace) в местное меню родительской папки.
Однако этого ещё не достаточно для функционирования задуманного, и данный набор макросов призван восполнить пробелы.
• F2: (в панелях) открывает ближайший файл в текущей ветке папок.
(в меню) переключение между местным/главным меню.
• BS: (в меню) открытие меню из родительской папки (пустые пропускаются).
Если открыто какое-то подменю, то вызывает переход на уровень выше этого же меню
• Ctrl+Shift+F2 (в панелях/редакторе/вьюере), или Shift+F2 (в меню)
отображает список всех FarMenu.ini в текущей ветке папок, а также главное/глобальное меню.
Доступные действия: запустить, отредактировать, открыть на панели.
Дополнительно:
Благодаря mf.usermenu есть возможность вызывать меню из любого файла, поэтому в этом же списке отображаются:
• все меню из папки Menus (маску можно задать)
• дополнительные меню из текущей папки (маску можно задать)
Ограничения:
Переход по BS не работает, если меню вызвано из файла с помощью mf.usermenu
https://bugs.farmanager.com/view.php?id=3570
Опции можно изменить в начале скрипта.
А чтобы после каждого обновления не приходилось вручную восстанавливать изменённые значения опций рекомендуется использовать возможности cfgscript из пакета ScriptsBrowser.
]]
Macro {
description="UserМен&Ю: ближайшее (jd)"; --71 -- description="UserMenu: open nearest"; --https://bugs.farmanager.com/view.php?id=3508
area="Shell Tree"; key="F2"; key2="F3";
sortpriority=95;
id="08A5B8A6-D7D9-4CD5-8EA0-66160AEACAFE";
action=function()
mf.usermenu(1)
Keys"Right Enter"
if not Menu.Value then Keys"BS" end --идти вверх, если нет местных --go level up if no local
if not Menu.Value then Keys"ShiftF2" end --вернуться к основному, если все еще нет --return to main if still no local
end;
}
--[=[
John Doe Sun 05 Nov 2017 22:33
https://forum.farmanager.com/viewtopic.php?p=147182#p147182
Shmuel wrote: ↑ https://forum.farmanager.com/viewtopic.php?p=147176#p147176
Sun 05 Nov, 2017 19:25
Во-первых, можно создать «локальный» usermenus FarMenu.ini в корневых каталогах поддеревьев.
Например, поместите его в C:\Development. Затем можно переключаться между глобальным и локальным usermenus по ShiftF2.
-- Вот мое решение для этой задачи:
Macro {
description="UserМен&Ю: открыть ближайшее (jd) F3"; -- description="UserMenu: open nearest";
sortpriority=85;
area="Shell"; -- area="Shell Tree";
key="F2";
id="84B0CBF2-8790-44DC-A311-32104F03FE0F";
action=function()
mf.usermenu(1); Keys"Enter ShiftF2"
end;
}
-- (Возможно, я должен опубликовать полный набор моих макросов UserMenu).
]=]--
Macro {
description="UserМен&Ю: стандартное в текущей папке (по jd)"; --71
area="Shell"; key="F2"; key2="F4";
sortpriority=91;
id="3D7E5C97-D473-4687-BD46-2C6352CBDE29";
action=function()
mf.usermenu(2,"farmenu.ini")
end;
}
Macro {
description="UserМен&Ю: вызвать ранее найденное [в папке]"; --71
area="Shell"; sortpriority=90; key="F2"; key2="F5";
id="F4E6A380-335E-432E-B1A4-0ABAB25BA379";
action=function()
local izpamiatj = mf.mload("ranee","izpapki",filenext)
-- вызываем из базы данных полное имя последнего исследованного файла-меню, запомненного макросом 'F 2 [[ ... (sToLp)use.lua'
mf.usermenu(2,izpamiatj) -- запускаем меню из вызванного файла
end;
}
Macro {
description="UserМен&Ю: вызвать ранее найденное [в бранче]"; --71
area="Shell"; sortpriority=88; key="F2"; key2="F6";
priority=40;
id="6950F0E9-2143-495F-AD37-BB4085C2BB7C";
action=function()
local izpamiatj = mf.mload("napamiatj","branch",filenext)
-- вызываем из базы данных полное имя последнего исследованного файла-меню, запомненного макросом 'F 2 [[ ... (sToLp)use.lua'
mf.usermenu(2,izpamiatj) -- запускаем меню из вызванного файла
end;
}
Macro {
area="Info Shell Tree"; sortpriority=81;
key="F2"; key2="F7";
description="UserМен&Ю: на выбор из спецперечня"; -- 71
action = function()
mf.usermenu(3,"0_F_2.FarMenu.ini") Keys("Enter")
end;
}
function string.starts(String,Start)
return String:sub(1,Start:len())==Start
end
Macro { area="Shell"; key="F2"; key2="F9";
sortpriority=75; flags=""; priority=40;
description="UserМен&Ю: для конкретных (под)каталогов (pepak)";
id="E18FE560-C934-450E-B84B-86EE860F0565";
action=function()
if string.starts(APanel.Path, "C:\\Downloads") then
mf.usermenu(3, "Downloads.farMenu.ini")
elseif string.starts(APanel.Path, "D:") then
mf.usermenu(3, "MenuForDriveD.farMenu.ini")
else
mf.usermenu(0, "")
end
end;
}
--[=[
pepak Sun 05 Nov 2017 19:36 https://forum.farmanager.com/viewtopic.php?p=147178#p147178
В течение некоторого времени я думал о способах создания usermenu, который будет работать для всего каталога (с подкаталогами).
Например. в C:\Development и во всех его подкаталогах у меня было бы другое меню, которое было бы повсеместно.
Оказывается, это удивительно легко:
Создайте стандартный глобальный usermenu (для «везде»).
В %FARPROFILE%\Menus создайте usermenus для ваших конкретных деревьев каталогов.
Например. Development.ini и MenuForDriveD.ini для примера. Их формат такой же, как для стандартного usermenu.
В %FARPROFILE%\Macros\scripts создайте файл TreeBasedUsermenu.lua со следующим содержимым
(измененным в соответствии с вашими требованиями, обратите внимание, что имена каталогов не должны заканчиваться обратным слэшем)
]=]--
Macro {
description="UserМен&Ю: создать tmp-файл ini-БРАНЧа папки"; --71 на "
area="Shell"; key="F2"; key2="F12";
id="14B1352A-867F-474A-BA04-3DFAB0EB5F8C"; sortpriority = 70;
action=function()
local curPfold = APanel.Path0 -- запоминаем текущую папку активной панели
local curPfile = APanel.Current -- запоминаем место расположения курсора активной панели
mf.print("tmp:<dir /b /s /a-d") Keys"Enter" -- делаем бранч с подпапками и направляем его в темп-панель
-- примечание: бранч из комстроки выдаёт ёлочки если в стартовом батнике Far`а в начале записано: chcp 65001, а в конце: chcp 866.
Keys"CtrlI Ins" mf.print("_luafilter_") Keys"2*Tab End" -- начинаем устанавливать временный фильтр на показ в панели только определённых .ini*-файлов
mf.print("farmenu,*.farmenu,*.ini*,*.in_i*,|*Far.exe.ini,*Far.exe.example.ini,*Everything.ini,*FarRun.ini,*ConEmuVersion*.ini,*.txt,*.hrc,*.org,*.add*,*doskey*.ini,*Loader.ini,*.arc,*.7z,*\\plugins*\\*.*,*\\_setupFarManager*\\*.*,*\\ConsTools*\\*.*,*\\Utils*\\*.*,*\\pNtfsStreamExplorer\\*.*") -- вводим маску файлов
for k=1,11 do Keys("Down") end Keys("Multiply") -- на папки выставляем атрибут '?'
Keys("Enter Space Enter") -- завершаем установку фильтра панели
-- установка фильтра перенята у Shmuel Mon 28 Dec 2015 12:34 https://forum.farmanager.com/viewtopic.php?p=134643#p134643
Keys"Multiply CtrlI" Menu.Select("_luafilter_",1) Keys"Del Enter Esc" -- выделяем все файлы в tmp-панели и снимаем временно установленный фильтр
Keys"Multiply F7" -- инвертируем пометку файлов и удаляем из tmp-панели файлы, не относящиеся к делу
Keys"AltShiftF2" mf.print(curPfold.."\\_ini.temp") Keys"Enter Enter" -- создаём _ini-branch.temp-список и выходим в панель
mf.print("goto: "..curPfile) Keys"Enter " -- позиционируем курсор на ранее запомненное место
end;
}
Macro {
description="UserМен&Ю: ini-БРАНЧ Far`а в tmp-панель"; --71 на "
area="Shell"; key="F2"; key2="Ctrl0";
id="17A1E37F-2818-48A8-B809-C04176449081"; sortpriority = 66;
action=function()
local IniTempName=win.GetEnv("FARHOME").."\\_ini.temp" -- определяем полное имя tmp-списка в папке Far`а
mf.print("tmp:"..IniTempName) Keys"Enter" -- направляем содержание _ini.temp из папки Far`а в темп-панель
end;
}
Macro { -- подсобный макрос
description="UserMen&Ю: фиксация переходов хоткеем (по jd)"; --71 -- description="UserMenu: BS to close submenu (instead of calling parent menu file)";
area="Shell"; key="F2 CtrlAltBS"; key2="CtrlAltBS";
sortpriority=59;
id="C49D8AB2-D777-4982-BE0D-313FAE8E48F5";
action=function()
Keys"CtrlShift9" -- помещаем ссылку на текущую папку в 9-ую ячейку меню "Ссылки на папки" (для обеспечения цикла)
mf.usermenu(1) Keys"Right Enter" -- переходим в меню (в котором можно применять BS) см. https://bugs.farmanager.com/view.php?id=3570
Keys"BS" -- переходим в следующее по порядку меню
Keys"AltF4" -- переключаемся в режим модального редактирования файла-меню
local file = Editor.FileName -- определяем полное имя файла (т.е. с путём)
Keys"Esc Esc" -- выходим из редактора и из меню в панели
if APanel.Root then
far.Message("\nМакрос завершается.\n","Папка корневая!")
mf.exit() -- прерываем макрос
end
if type(file)=="string" then
local dlina = mf.string(mf.len(file))
-- mf.msgbox("Длина полного имени файла-меню",file.."\n\n"..dlina)
mf.msave(dlina,"trek",file) -- сохранить в базу trek значение file с ключом dlina -- mf.msave(key,name,value)
mf.print("Goto:\""..file.."\"") Keys"Enter" -- переходим в папку с файлом текущего пользовательского меню
end
end;
}
local um = "FarMenu.ini"
local globalpath = win.GetEnv"FARHOME".."\\"
local global_um = globalpath..um
local userpath = win.GetEnv"FARPROFILE".."\\"
local user_um = userpath..um
local menus = userpath.."Menus"
local function traverse(path)
return function(_,updir)
return updir:match"^(.+[\\/]).-[\\/]"
end,nil,path.."\\"
end
local function exist(fullname)
local attr = win.GetFileAttr(fullname)
return attr and not attr:find"d" --and fullname
end
local function eq(name1,name2)
return name1:lower()==name2:lower()
end
local Items
local function addSection(name)
Items.section = {text=name,separator=true}
Items.sectionN = #Items
end
local function addItem(name,file,checked,grayed)
if not name then return end
if #Items==Items.sectionN then
table.insert(Items,Items.section)
end
table.insert(Items,{
text = name,
file = file,
checked = checked,
grayed = grayed,
})
end
local function makeUMlist(path)
Items = {}
local global,user = true,true
local function mark(fullname)
local checked
if eq(fullname,global_um) then
checked,global = "⌂",false
elseif eq(fullname,user_um) then
checked,user = "~",false
end
return checked
end
local local_um = path..um
addSection("Меню в текущей папке:") -- строку добавил sToLp вместо следующей
-- addItem("Local menu",local_um,mark(local_um) or "►",not exist(local_um))
addItem(um,local_um,"") -- строку добавил sToLp
if O.LocalMask then
far.RecursiveSearch(path,O.LocalMask,function(Item,fullname)
if not (Item.FileAttributes:find"d" or eq(fullname,local_um)) then
addItem(Item.FileName,fullname)
end
end)
end
-- addSection()
addSection("Ветка стандартных (farmenu.ini) меню:") -- строку добавил sToLp вместо предыдущей
for dir in traverse(path:sub(1,-2)) do
local fullname = dir..um
if exist(fullname) then
addItem(dir,fullname,mark(fullname))
end
end
if O.MenusMask then
local attr = win.GetFileAttr(menus)
if attr and attr:find"d" then
addSection("Меню в папке ProFile\\Menus:") -- addSection("Menus")
far.RecursiveSearch(menus,O.MenusMask,function(Item,fullname)
if not Item.FileAttributes:find"d" then
addItem(Item.FileName,fullname)
end
end)
end
end
-- addSection()
addSection("Меню Профиля '~' и Глобальное '⌂'") -- строку добавил sToLp вместо предыдущей
addItem(user and "(User - станартное меню в %FarProfile%)",user_um,"~",not exist(user_um))
addItem(global and "(Global - станартное меню в %FarHome%)",global_um,"⌂",not exist(global_um))
return Items
end
local UserMenuListId = win.Uuid"5BB097BB-DC29-4B16-9D80-80C70EA71152"
local props = {
Title="Макрос 'UserMenЮ: Перезагрузка' (jd) Выберите меню пользователя:", -- Title="Choose user menu:",
Bottom="Enter, F4, Ctrl+PgDn",
Id=UserMenuListId,
}
local function showMenuList(idx)
props.SelectIndex = idx
local items = makeUMlist(far.GetCurrentDirectory().."\\")
local item,pos = far.Menu(props,items,"F1 F4 CtrlPgDn CtrlNum3 Ctrl3")
if item then
while Area.UserMenu do Keys"Esc" end
if not item.BreakKey then
mf.usermenu(2,item.file)
else
local file = items[pos].file
if item.BreakKey=="F1" then
mf.acall(nfo.help,nfo)
elseif item.BreakKey=="F4" then
editor.Editor(file,nil,nil,nil,nil,nil,"EF_OPENMODE_BREAKIFOPEN")
mf.postmacro(showMenuList,pos)
else--if item.BreakKey=="CtrlPgDn" then
local dir_file = "^(.+\\)(.-)$"
Panel.SetPath(0,file:match(dir_file))
end
end
end
end
Macro {
description="UserМен&Ю: список доступных меню (jd)"; --71 -- description="UserMenu: show list (from UserMenu)";
area="Shell"; -- area="UserMenu"; area="Shell Viewer UserMenu";
key="F2"; key2="CtrlShift2";
id="CFE55CD6-EB6F-4F0B-AEF2-C7F28EC892C8";
action=showMenuList;
}
Macro {
area="Shell"; key="F2"; key2="AltPgUp";
priority=40; sortpriority=10;
description="EMenЮ: контекстное"; -- 70
flags="NoPluginPanels";
action=function()
Plugin.Open("EMenu") -- используется макрос "007_pluginOpen(maxRusov).lua" см.:
-- Max Rusov Вт 09 апр, 2013 14:45 http://forum.farmanager.com/viewtopic.php?p=107512#p107512
-- Добавь функции и вызывай плагин по имени: Plugin.Open("FarFTP")
-- имя плагина берётся из вызываемого по нативному F11 F3 диалогу "Информация о плагине"
Keys("Enter")
-- Plugin.Menu("742910F1-02ED-4542-851F-DEE37C2E13B2","C8660293-6195-4303-9A5F-A6E7F603AE12") Keys="Enter" -- можно и так
end;
}
--[[
макрос "C. дважды LCtrl к меню назад ← → вперёд к меню RCtrl дважды" находится в файле:
"%FarProfile%\Macros\scripts\men_lua\[[F1-F12_переходыПоКругуМенюВыбораМакросовВдиапазонеF1-F12сМодификаторами(sToLp)men.lua"
]]--