Переключение arclite <-> multiarc из архива

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Переключение arclite <-> multiarc из архива

Post by Smitis »

Продублирую отсюда, что бы не потерялся.
Макрос, переключающийся между ArcLite и MultiArc при нахождении в архиве RAR.
При переключении сохраняется выделение файлов, положение курсора и вид панелей (сортировка, режим и пр.).
Клавиши по умолчанию AltShiftA или ShiftF1.
  1. -- Переключение между архиваторами ArcLite <-> MultiArc из архивов RAR.
  2.  
  3. -- v.1.01 (C) Smitis, 2016-2017
  4.  
  5. -- Обсуждение: http://forum.farmanager.com/viewtopic.php?t=10834
  6.  
  7.  
  8.  
  9. local ARCLITE_ID = win.Uuid("65642111-AA69-4B84-B4B8-9249579EC4FA")
  10.  
  11. local MULTIARC_ID = win.Uuid("C5508DDB-5175-4736-9A10-C8F6EED7B32F")
  12.  
  13.  
  14.  
  15. local F = far.Flags
  16.  
  17.  
  18.  
  19. Macro {
  20.  
  21.     description="Arcs: Switch between ArcLite and MultiArc";
  22.  
  23.     area="Shell Search";
  24.  
  25.     key="AltShiftA ShiftF1";
  26.  
  27.     condition=function()
  28.  
  29.         local pluginid = panel.GetPanelDirectory(nil,1).PluginId
  30.  
  31.         return pluginid == ARCLITE_ID or pluginid == MULTIARC_ID
  32.  
  33.     end;
  34.  
  35.     action=function()
  36.  
  37.         if Area.Search then Keys "Esc" end
  38.  
  39.         if Object.Title:sub(1,12)=="arclite:Rar:" or Object.Title:sub(1,13)=="arclite:Rar5:" or Object.Title:sub(1,4)=="RAR:" then
  40.  
  41.             local dir = panel.GetPanelDirectory(nil,1)
  42.  
  43.             local inf = panel.GetPanelInfo(nil,1)
  44.  
  45.             local topfile = Panel.Item(0,inf.TopPanelItem,0)
  46.  
  47.             local currentfile = Panel.Item(0,inf.CurrentItem,0)
  48.  
  49.             local selected = APanel.Selected
  50.  
  51.             mf.clip(5,2) -- для сохранения выделения через буфер
  52.  
  53.             if selected then Keys "CtrlShiftIns" end
  54.  
  55.             dir.PluginId = dir.PluginId==ARCLITE_ID and MULTIARC_ID or ARCLITE_ID
  56.  
  57.             if panel.SetPanelDirectory(nil,1,dir) then
  58.  
  59.                 local inf2 = panel.GetPanelInfo(nil,1)
  60.  
  61.                 -- Восстанавливаем вид панели
  62.  
  63.                 panel.SetViewMode(nil,1,inf.ViewMode)
  64.  
  65.                 panel.SetSortMode(nil,1,inf.SortMode)
  66.  
  67.                 panel.SetSortOrder(nil,1,band(inf.Flags,F.PFLAGS_REVERSESORTORDER)~=0)
  68.  
  69.                 panel.SetNumericSort(nil,1,band(inf.Flags,F.PFLAGS_NUMERICSORT)~=0)
  70.  
  71.                 panel.SetCaseSensitiveSort(nil,1,band(inf.Flags,F.PFLAGS_CASESENSITIVESORT)~=0)
  72.  
  73.                 panel.SetDirectoriesFirst(nil,1,band(inf.Flags,F.PFLAGS_DIRECTORIESFIRST)~=0)
  74.  
  75.                 if band(inf.Flags,F.PFLAGS_SHOWHIDDEN) ~= band(inf2.Flags,F.PFLAGS_SHOWHIDDEN) then Keys "CtrlH" end
  76.  
  77.                 if band(inf.Flags,F.PFLAGS_USESORTGROUPS) ~= band(inf2.Flags,F.PFLAGS_USESORTGROUPS) then Keys "ShiftF11" end
  78.  
  79.                 if band(inf.Flags,F.PFLAGS_SELECTEDFIRST) ~= band(inf2.Flags,F.PFLAGS_SELECTEDFIRST) then Keys "ShiftF12" end
  80.  
  81.                 -- Позиционируем курсор так, чтобы не только текущий файл был тот же, но и его положение было то же самое
  82.  
  83.                 Panel.SetPosIdx(0,-1)
  84.  
  85.                 Panel.SetPos(0,topfile)
  86.  
  87.                 Panel.SetPos(0,currentfile)
  88.  
  89.                 -- Восстанавливаем выделение
  90.  
  91.                 if selected then Panel.Select(0,1,2,mf.clip(0)) end
  92.  
  93.             end
  94.  
  95.         end
  96.  
  97.     end;
  98.  
  99. }
ArcSwitch.1.01.7z
ArcSwitch 1.01
(1.22 KiB) Downloaded 96 times
Last edited by Smitis on Fri 21 Jul, 2017 13:53, edited 1 time in total.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Переключение arclite <-> multiarc из архива

Post by Smitis »

Версия 1.01
- Добавлено сохранение режима панелей, сортировки, показ скрытых файлов. Походу выяснилось, что не все режимы можно задать напрямую из lua :(
- Позиционирование курсора сделано по именам, а не по индексу, так как выяснилось, что MultiArc не всегда правильно читает время создания файлов и сортировка получается разной. При таком способе положение текущего файла на панели может измениться, но хотя-бы сам текущий файл останется прежним. :o
Last edited by Smitis on Fri 21 Jul, 2017 14:02, edited 1 time in total.
Разум когда-нибудь победит.
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Переключение arclite <-> multiarc из архива

Post by Wave »

В принципе, я этим макросом не пользуюсь, потому что не пользуюсь мультиарком, арклайта хватает. Но вот сейчас перебираю завалы макросов, и вот что получается.
При переключении арклайт на мультиарк без вопросов переключает.
При переключении мультиарк на арклайт переключает с таким вот сообщением:

Кроме того, в обоих случаях курсор оказывается в корне текущей папки архива.

FAR 5710. Не исключаю вину своей кучи залежей макросов, считая такие вещи как LuaManager и многократные за эти годы обновления ФАРа поверх без создания нового профиля.

Да, и чуть не забыл. Проверку на архив я переделал вот так:

Code: Select all

if Object.Title:sub(1,12):lower()=="arclite:rar:" or Object.Title:sub(1,13):lower()=="arclite:rar5:" or Object.Title:sub(1,4)=="RAR:" then
а то у вас проверяется Object.Title:sub(1,12)=="arclite:Rar:" а в заголовке светится ArcLite:Rar и переключения не происходит.
Пользуюсь ФАРом больше 20 лет © собирательный.
aflexus
Posts: 74
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 23 times
Been thanked: 1 time

Переключение arclite <-> multiarc из архива

Post by aflexus »

Wave, ошибка подпирается костылем где-то так:
  1. if F.PFLAGS_NUMERICSORT then panel.SetNumericSort(nil,1,band(inf.Flags,F.PFLAGS_NUMERICSORT)~=0) end
  2.  
  3. if F.PFLAGS_CASESENSITIVESORT then panel.SetCaseSensitiveSort(nil,1,band(inf.Flags,F.PFLAGS_CASESENSITIVESORT)~=0) end
Но проблема с сортировкой, в целом, остается.
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Переключение arclite <-> multiarc из архива

Post by Wave »

Костыль работает, да, спасибо. Остался глючок, что при переключении на мультиарк в ряде случаев, не всегда курсор оказывается в корне текущей папки архива. При переключении на арклайт позиция курсора внутри архива сохраняется.
Пользуюсь ФАРом больше 20 лет © собирательный.
Post Reply

Return to “Обсуждение макросов”