Folder Shortcuts Menu

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Folder Shortcuts Menu

Post by Smitis »

Latest post of the previous page:

Я помню про setfenv для конфига. Но пока не определился, лучше это или хуже :)
И конфиг пробовал по разному записывать. В некоторых случаях запись в виде "cfg.параметр = что-то" оказывается удобней (не надо расставлять запятые, можно группировать параметры из разных таблиц/подтаблиц в случае более сложной структуры, делать множественное присваивание и т.п.).
Разум когда-нибудь победит.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Автофильтр вместо быстрого поиска

Post by buniak_a_h »

Видимо, макрос устарел. Где новую (рабочую) версию можно посмотреть?
Файл FolderShortcutsMenu.lua, строка 150, обращение far.LuafarVersion()
Файл LuaMacro\changelog:
shmuel 02.03.2015 19:01:59 +0200 - build 487
1. LuaFAR: убрана функция far.LuafarVersion.
Last edited by buniak_a_h on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Сообщение перенесено из неправильной темы
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
HaRT
Moderator
Posts: 10856
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Автофильтр вместо быстрого поиска

Post by HaRT »

buniak_a_h wrote: Файл FolderShortcutsMenu.lua
Какое это имеет отношение к данной Теме?!
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Добавлена ссылка на исходную (неправильную) Тему, где было размещено цитируемое сообщение.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Автофильтр вместо быстрого поиска

Post by buniak_a_h »

HaRT wrote: Какое это имеет отношение к данной Теме?!
Макрос в шапке нерабочий... А к какой теме это отнести?

Code: Select all

...cripts\Smits\FolderShortcutsMenu\FolderShortcutsMenu.lua:150:
attempt to call field 'LuafarVersion' (a nil value)
Я всего лишь спросил, есть ли новая версия макроса
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
HaRT
Moderator
Posts: 10856
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Автофильтр вместо быстрого поиска

Post by HaRT »

buniak_a_h wrote: Макрос в шапке нерабочий
Я перенёс сообщения в правильную тему.
В следующий раз удалю без предупреждения. Будьте внимательнее!
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Folder Shortcuts Menu

Post by Smitis »

2.08
- lm:post больше не поддерживается, ссылки сохраняются только как lua:

П.С.
Сорри, что сразу не заметил, что используется теперь удаленная функция LuafarVersion, просто у меня уже v.3, но она бета, поэтому не выкладывал.
Разум когда-нибудь победит.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Folder Shortcuts Menu

Post by citRiks »

Smitis wrote: Mon 08 Aug, 2016 19:08у меня уже v.3, но она бета, поэтому не выкладывал.
Ну выкладывайте чтоль, пусть будет бета
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Folder Shortcuts Menu

Post by Smitis »

Не прошло и пяти лет...
Или уже прошло?
Как время бежит... :)
На праздниках займусь, приведу в божеский вид и выложу.

С наступающим!
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Folder Shortcuts Menu

Post by Smitis »

Я помню про своё обещание, но, как обычно, кое-что уже забыл, стал переделывать, одно потянуло за собой другое... В общем, делаю.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Folder Shortcuts Menu

Post by Smitis »

Версия 3.02 beta
Всё переписано с нуля. Конфига нет. Языковых настроек нет.
Условно, состоит из трёх частей (разделены двойными линиями):
Часть 1 отвечает за переход по ссылке. Сделано через префикс (fsm) за которым идёт таблица с данными.
Часть 2 это макросы для вставки ссылки. В предыдущей версии макросов было (очень) много. А хотелось ещё больше для вставки всяких различных вариантов. Я уже сам начал в них путаться и решил, что это перебор. Поэтому сейчас их всего два, Ctrl- вставляет в текущую позицию открытого пользовательского меню ссылку для одной панели. Макрос Ctrl= для обеих панелей. В принципе, можно наворотить и как раньше, только вынести это всё в отдельный скрипт и не мешать с базовым скриптом. Можно сделать диалог, появляющийся при вставке и позволяющий контролировать параметры. Надо подумать.
Часть 3 самая неоднозначная - редактор ссылки. Макрос CtrlF4 работает как из пользовательского меню так и из диалога редактирования пункта меню. Требует модуль DialogClass версии не ниже 1.15. Очень здорово, но редактировать уже созданую ссылку мне показалось не очень удобно, а если ещё добавится параметров, то вообще будет мрак - проще заново создать ссылку, а старую удалить.
Сам редактор ссылки можно удалить из скрипта если не нужен, на прочий функционал не влияет.
  1. --[[--------------------------------------------------------------------------------------------------------------------
  2.  
  3. Folder Shortcuts Menu v. 3.02 (c) 2013-2022 Smitis
  4.  
  5. http://forum.farmanager.com/viewtopic.php?t=7873
  6.  
  7. --]]--------------------------------------------------------------------------------------------------------------------
  8.  
  9.  
  10.  
  11. local F = far.Flags
  12.  
  13.  
  14.  
  15. ------------------------------------------------------------------------------------------------------------------------
  16.  
  17. ------------------------------------------------------------------------------------------------------------------------
  18.  
  19. function FSM_Goto(fsm)
  20.  
  21.     local ap = 1 -- на какой панели открываем (0-пассивная, 1-активная), изменяем при открытии дискового меню
  22.  
  23.     local pa = math.fmod(ap+1,2) -- инвертируем (0->1,1->0) (это заготовка на будущее для сохранения положения панелей)
  24.  
  25.     if fsm.a.folder and panel.SetPanelDirectory(nil,ap,{Name=fsm.a.folder,Param=fsm.a.param,PluginId=win.Uuid(fsm.a.plugin),File=fsm.a.host}) then
  26.  
  27.         -- Сначала в самый конец, потом к верхнему файлу (это обеспечит прокрутку списка) и только потом текущему файлу
  28.  
  29.         Panel.SetPosIdx(pa,-1)
  30.  
  31.         Panel.SetPos(pa,fsm.a.top)
  32.  
  33.         Panel.SetPos(pa,fsm.a.file)
  34.  
  35.         panel.RedrawPanel(nil,ap)
  36.  
  37.     end
  38.  
  39.     if fsm.p and fsm.p.folder and panel.SetPanelDirectory(nil,pa,{Name=fsm.p.folder,Param=fsm.p.param,PluginId=win.Uuid(fsm.p.plugin),File=fsm.p.host}) then
  40.  
  41.         Panel.SetPosIdx(ap,-1)
  42.  
  43.         Panel.SetPos(ap,fsm.p.top)
  44.  
  45.         Panel.SetPos(ap,fsm.p.file)
  46.  
  47.         panel.RedrawPanel(nil,pa)
  48.  
  49.     end
  50.  
  51. end
  52.  
  53. ------------------------------------------------------------------------------------------------------------------------
  54.  
  55. CommandLine {
  56.  
  57.     description = "Folder shorcuts menu";
  58.  
  59.     prefixes = "fsm";
  60.  
  61.     action = function(prefix,data)
  62.  
  63.         local code,err = loadstring('return '..data:gsub("!!","!"))
  64.  
  65.         if not err then
  66.  
  67.             local result,fsm = pcall(code)
  68.  
  69.             if result then
  70.  
  71.                 FSM_Goto(fsm)
  72.  
  73.                 return
  74.  
  75.             end
  76.  
  77.         end
  78.  
  79.         -- TODO: Сообщение об ошибке
  80.  
  81.     end;
  82.  
  83. }
  84.  
  85. ------------------------------------------------------------------------------------------------------------------------
  86.  
  87. ------------------------------------------------------------------------------------------------------------------------
  88.  
  89. -- Подготовить строку с информацией для вставки
  90.  
  91. local function FSM_Format(fsm)
  92.  
  93.     local fmt = '%s={folder="%s",param="%s",plugin="%s",host="%s",file="%s",top="%s"}'
  94.  
  95.     local r = 'fsm:{'..fmt:format('a',fsm.a.folder,fsm.a.param,fsm.a.plugin,fsm.a.host,fsm.a.file,fsm.a.top)
  96.  
  97.     if fsm.p then
  98.  
  99.         r = r .. ',' .. fmt:format('p',fsm.p.folder,fsm.p.param,fsm.p.plugin,fsm.p.host,fsm.p.file,fsm.p.top)
  100.  
  101.     end
  102.  
  103.     return (r..'}'):gsub("!","!!"):gsub("\\","\\\\")
  104.  
  105. end
  106.  
  107. ------------------------------------------------------------------------------------------------------------------------
  108.  
  109. -- Получить информацию о панели (активной или пассивной)
  110.  
  111. local function FSM_GetPanelInfo(ap)
  112.  
  113.     local pa = math.fmod(ap+1,2) -- инвертируем 0/1
  114.  
  115.     local dir = panel.GetPanelDirectory(nil,ap)
  116.  
  117.     local inf = panel.GetPanelInfo(nil,ap)
  118.  
  119.     return {
  120.  
  121.         folder = dir.Name,
  122.  
  123.         param = dir.Param,
  124.  
  125.         plugin = win.Uuid(dir.PluginId),
  126.  
  127.         host = dir.File,
  128.  
  129.         file = Panel.Item(pa,inf.CurrentItem,0),
  130.  
  131.         top = Panel.Item(pa,inf.TopPanelItem,0),
  132.  
  133.         --viewmode = inf.ViewMode,
  134.  
  135.         --sortmode = inf.SortMode,
  136.  
  137.         --flags = inf.Flags,
  138.  
  139.     }
  140.  
  141. end
  142.  
  143. ------------------------------------------------------------------------------------------------------------------------
  144.  
  145. -- Вставить ссылку в текущую позицию меню
  146.  
  147. local function FSM_Insert(both)
  148.  
  149.     local fsm = {}
  150.  
  151.     fsm.a = FSM_GetPanelInfo(1)
  152.  
  153.     if both then
  154.  
  155.         fsm.p = FSM_GetPanelInfo(0)
  156.  
  157.     end
  158.  
  159.  
  160.  
  161. -- Название пункта меню
  162.  
  163. local label = APanel.Path0
  164.  
  165. if APanel.HostFile ~= "" then
  166.  
  167.     label = APanel.HostFile
  168.  
  169. elseif APanel.Path ~= "" then
  170.  
  171.     label = APanel.Path
  172.  
  173. end
  174.  
  175. label = label:match("([^\\/]+)$"):gsub("!","!!") -- убрать путь и удвоить «!»
  176.  
  177.  
  178.  
  179. -- Вставка пункта меню
  180.  
  181. Keys "Ins Enter Tab" print(label) Keys "Tab"
  182.  
  183. print(FSM_Format(fsm))
  184.  
  185. Keys "CtrlEnter"
  186.  
  187. end
  188.  
  189. ------------------------------------------------------------------------------------------------------------------------
  190.  
  191. Macro { -- Добавить в открытое меню
  192.  
  193.     description = "Folder Shortcuts Menu: Add shortcut";
  194.  
  195.     area = "UserMenu";
  196.  
  197.     id = "D7C1870E-2434-4640-B9DD-AFF120CC5203";
  198.  
  199.     key = "Ctrl-";
  200.  
  201.     action = function() FSM_Insert(false) end;
  202.  
  203. }
  204.  
  205. ------------------------------------------------------------------------------------------------------------------------
  206.  
  207. Macro { -- Добавить в открытое меню для обеих панелей
  208.  
  209.     description = "Folder Shortcuts Menu: Add shortcut 2";
  210.  
  211.     area = "UserMenu";
  212.  
  213.     id = "E9725979-5D60-487E-BF1C-E3ACE3C68289";
  214.  
  215.     key = "Ctrl=";
  216.  
  217.     action = function() FSM_Insert(true) end;
  218.  
  219. }
  220.  
  221. ------------------------------------------------------------------------------------------------------------------------
  222.  
  223. ------------------------------------------------------------------------------------------------------------------------
  224.  
  225. local dialog = require "DialogClass"
  226.  
  227.  
  228.  
  229. local EditShortcutId = "30D09200-B62D-4F3A-B61B-99BED13F8E81"
  230.  
  231.  
  232.  
  233. -- Здесь потом можно будет сделать что-нибудь полезное
  234.  
  235. local function FSM_DlgProc(hDlg,Msg,Param1,Param2,D,DI)
  236.  
  237.     if Msg==F.DN_CONTROLINPUT and Param2.EventType==F.KEY_EVENT and Param2.KeyDown then
  238.  
  239.         --local k = far.InputRecordToName(Param2) -- клавиша "as is"
  240.  
  241.         --local a = k:gsub("[RL]Ctrl","Ctrl"):gsub("[RL]Alt","Alt") -- для упрощения проверки
  242.  
  243.     elseif Msg==F.DN_CLOSE and Param1==DI.OkButton.Id then
  244.  
  245.    
  246.  
  247. end
  248.  
  249. end
  250.  
  251.  
  252.  
  253. -- Если UserMenu - открыть пункт на редактирование.
  254.  
  255. -- Если диалог редактирования, редактируем ссылку.
  256.  
  257. -- Иначе оставляем как есть.
  258.  
  259. local function FSM_Edit()
  260.  
  261.     local result
  262.  
  263.     local fsm = {} -- таблица с данными ссылки
  264.  
  265.     local di = {} -- элементы диалога
  266.  
  267.     local dv = {} -- редактируемые значения из диалога
  268.  
  269.  
  270.  
  271. if Area.UserMenu then Keys "ShiftF4" end
  272.  
  273. if not Area.Dialog or Dlg.Id~=far.Guids.EditUserMenuId then return end
  274.  
  275.  
  276.  
  277. local info = far.AdvControl(F.ACTL_GETWINDOWINFO)
  278.  
  279. local hdlg = info.Id
  280.  
  281. di.data = hdlg:send(F.DM_GETDLGITEM,8)
  282.  
  283. if band(di.data[9],F.DIF_HIDDEN)~=0 then -- пункт скрыт, это диалог для подменю
  284.  
  285.     return
  286.  
  287. end
  288.  
  289. dv.data = di.data[10]:match('^fsm:(.+)')
  290.  
  291. if not dv.data then -- это не ссылка
  292.  
  293.     return
  294.  
  295. end
  296.  
  297. di.hotkey = hdlg:send(F.DM_GETDLGITEM,3)
  298.  
  299. dv.hotkey = di.hotkey[10]:gsub("!!","!")
  300.  
  301. di.label = hdlg:send(F.DM_GETDLGITEM,5)
  302.  
  303. dv.label = di.label[10]:gsub("!!","!")
  304.  
  305. local code,err = loadstring('return '..dv.data:gsub("!!","!"))
  306.  
  307. if not err then
  308.  
  309.     result,fsm = pcall(code)
  310.  
  311.     if result then
  312.  
  313.         fsm.p = fsm.p or {}
  314.  
  315.         local D,DI = dialog.New {
  316.  
  317.             Guid = EditShortcutId,
  318.  
  319.             Title = "Edit Shortcut",
  320.  
  321.             W = 76, H = 25,
  322.  
  323.             DlgProc = FSM_DlgProc,
  324.  
  325.         }
  326.  
  327.         DI            {"t+", Text="Hot key:"}
  328.  
  329.         DI.HotKey     {"e", C=10, W=3, Text=dv.hotkey}
  330.  
  331.         DI            {"t", C=15, Text="Label:"}
  332.  
  333.         DI.Label      {"e@", C=25, Text=dv.label}
  334.  
  335.  
  336.  
  337.         DI            {"s+", Text="Active panel"}
  338.  
  339.         DI            {"t+", Text="Folder:"}
  340.  
  341.         DI.SetAFolder {"b;", C=-6, Text="Set&1",
  342.  
  343.             ItemProc = function(hDlg,Msg,Param2,self,D,DI)
  344.  
  345.                 if Msg==F.DN_BTNCLICK then
  346.  
  347.                     fsm.a = FSM_GetPanelInfo(1)
  348.  
  349.                     DI.AFolder:SetText(fsm.a.folder)
  350.  
  351.                     DI.AParam:SetText(fsm.a.param)
  352.  
  353.                     DI.APlugin:SetText(fsm.a.plugin)
  354.  
  355.                     DI.AHost:SetText(fsm.a.host)
  356.  
  357.                     DI.AFile:SetText(fsm.a.file)
  358.  
  359.                     return true
  360.  
  361.                 end
  362.  
  363.             end,
  364.  
  365.         }
  366.  
  367.         DI.AFolder    {"e+", Text=fsm.a.folder}
  368.  
  369.         DI            {"t+", Text="Param:"}
  370.  
  371.         DI            {"t", C=-36, Text="Plugin Id:"}
  372.  
  373.         DI.AParam     {"e+", W=28, Text=fsm.a.param}
  374.  
  375.         DI.APlugin    {"e", C=-36, Text=fsm.a.plugin}
  376.  
  377.         DI            {"t+", Text="Host file:"}
  378.  
  379.         DI.AHost      {"e+", Text=fsm.a.host}
  380.  
  381.         DI            {"t+", Text="Current file:"}
  382.  
  383.         DI.AFile      {"e+", Text=fsm.a.file}
  384.  
  385.  
  386.  
  387.         DI            {"s+", Text="Passive panel"}
  388.  
  389.         DI            {"t+", Text="Folder:"}
  390.  
  391.         DI.SetPFolder {"b;", C=-6, Text="Set&2",
  392.  
  393.             ItemProc = function(hDlg,Msg,Param2,self,D,DI)
  394.  
  395.                 if Msg==F.DN_BTNCLICK then
  396.  
  397.                     fsm.p = FSM_GetPanelInfo(0)
  398.  
  399.                     DI.PFolder:SetText(fsm.p.folder)
  400.  
  401.                     DI.PParam:SetText(fsm.p.param)
  402.  
  403.                     DI.PPlugin:SetText(fsm.p.plugin)
  404.  
  405.                     DI.PHost:SetText(fsm.p.host)
  406.  
  407.                     DI.PFile:SetText(fsm.p.file)
  408.  
  409.                     return true
  410.  
  411.                 end
  412.  
  413.             end,
  414.  
  415.         }
  416.  
  417.         DI.PFolder    {"e+", Text=fsm.p.folder}
  418.  
  419.         DI            {"t+", Text="Param:"}
  420.  
  421.         DI            {"t", C=-36, Text="Plugin Id:"}
  422.  
  423.         DI.PParam     {"e+", W=28, Text=fsm.p.param}
  424.  
  425.         DI.PPlugin    {"e", C=-36, Text=fsm.p.plugin}
  426.  
  427.         DI            {"t+", Text="Host file:"}
  428.  
  429.         DI.PHost      {"e+", Text=fsm.p.host}
  430.  
  431.         DI            {"t+", Text="Current file:"}
  432.  
  433.         DI.PFile      {"e+", Text=fsm.p.file}
  434.  
  435.        
  436.  
  437.         DI              {"s+",L=-1}
  438.  
  439.         DI.OkButton     {"b=!+", Text="OK"}
  440.  
  441.         DI.CancelButton {"b=", Text="Cancel"}
  442.  
  443.         --DI.SwapButton   {"b=", Text="&Swap"}
  444.  
  445.         D()
  446.  
  447.         if D.Ret==-1 or D.Ret==DI.CancelButton.Id then -- выходим без сохранения
  448.  
  449.             Keys "Esc"
  450.  
  451.             if Area.Dialog then -- диалог подтверждения выхода без сохранения
  452.  
  453.                 Keys "CtrlEnter"
  454.  
  455.             end
  456.  
  457.         elseif D.Ret==DI.OkButton.Id then -- выходим с сохранением
  458.  
  459.             dv.hotkey = DI.HotKey.Text
  460.  
  461.             dv.label = DI.Label.Text
  462.  
  463.             fsm.a.folder = DI.AFolder.Text
  464.  
  465.             fsm.a.param = DI.AParam.Text
  466.  
  467.             fsm.a.plugin = DI.APlugin.Text
  468.  
  469.             fsm.a.host = DI.AHost.Text
  470.  
  471.             fsm.a.file = DI.AFile.Text
  472.  
  473.             fsm.p.folder = DI.PFolder.Text
  474.  
  475.             fsm.p.param = DI.PParam.Text
  476.  
  477.             fsm.p.plugin = DI.PPlugin.Text
  478.  
  479.             fsm.p.host = DI.PHost.Text
  480.  
  481.             fsm.p.file = DI.PFile.Text
  482.  
  483.             di.hotkey[10] = dv.hotkey
  484.  
  485.             hdlg:send(F.DM_SETDLGITEM,3,di.hotkey)
  486.  
  487.             di.label[10] = dv.label:gsub("!","!!")
  488.  
  489.             hdlg:send(F.DM_SETDLGITEM,5,di.label)
  490.  
  491.             di.data[10] = FSM_Format(fsm)
  492.  
  493.             hdlg:send(F.DM_SETDLGITEM,8,di.data)
  494.  
  495.             Keys "CtrlEnter"
  496.  
  497.         end
  498.  
  499.     end
  500.  
  501. else
  502.  
  503.     -- TODO: обработка ошибки
  504.  
  505.     --dbg("Error loadstring")
  506.  
  507. end
  508.  
  509. end
  510.  
  511. ------------------------------------------------------------------------------------------------------------------------
  512.  
  513. Macro {
  514.  
  515.     description = "Folder Shortcuts Menu: Edit";
  516.  
  517.     area = "UserMenu";
  518.  
  519.     key = "CtrlF4";
  520.  
  521.     condition = function()
  522.  
  523.         return Menu.ItemStatus()==1
  524.  
  525.     end;
  526.  
  527.     action = FSM_Edit;
  528.  
  529. }
  530.  
  531. ------------------------------------------------------------------------------------------------------------------------
  532.  
  533. Macro {
  534.  
  535.     description = "Folder Shortcuts Menu: Edit";
  536.  
  537.     area = "Dialog";
  538.  
  539.     key = "CtrlF4";
  540.  
  541.     condition = function()
  542.  
  543.         return Dlg.Id==far.Guids.EditUserMenuId
  544.  
  545.     end;
  546.  
  547.     action = FSM_Edit;
  548.  
  549. }
  550.  
  551. ------------------------------------------------------------------------------------------------------------------------
Last edited by Smitis on Tue 01 Feb, 2022 21:08, edited 1 time in total.
Разум когда-нибудь победит.
Post Reply

Return to “Полезные макросы и скрипты”