MultiPanel — стек панелей

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »



Панелей на экране помещается всё так же две, но каждую из них в любой момент можно поместить в MRU-стек, и в любой другой момент достать оттуда в изначальном их состоянии (режим, сортировка, выделение).
Запомнить в стеке можно произвольное число панелей.
Список панелей сохраняется между запусками фара.
Если папка панели в данный момент не существует, то это индицируется (пункт списка серый).
Панели плагинов в основном поддерживаются, а если же панель невозможно сохранить, то это индицируется (пункт списка серый).

Запуск: Ctrl-~ — переключиться между активной и сохранённой, с отображением списка.

Шорткаты в списке (Ctrl должен удерживаться):

Шорткаты в панелях:

source | download

Last edited by John Doe on Tue 21 Jan, 2020 10:39, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

Latest post of the previous page:

В переменной Panels

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 13 times

MultiPanel — стек панелей

Post by aflexus »

В фаре 5151 при переключении постоянно вылазит ошибка:

Code: Select all

C:\Far3\Profile\Macros\scripts\MultiPanel.lua:106: bad argument #2 to 'band' (bad int64)
stack traceback:
[C]: in function 'band'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:106: in function 'setPanel'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:166: in function 'Pop'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:174: in function 'Swap'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:318: in function 'action'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:378: in function 'showMultiPanel'
C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:399: in function <C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:398>

Возможно ли как-то исправить?

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

Достаточно удалить указанную строку (106).

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 13 times

MultiPanel — стек панелей

Post by aflexus »

Вновь скрипт сломался. Обновился до 5545 с 5512. Это можно поправить?

Code: Select all

 C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:81: bad argument #1 to 'GetPanelInfo' (userdata expected, got number)
 stack traceback:
    [C]: in function 'GetPanelInfo'
    C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:81: in function 'getPanel'
    C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:449: in function 'action'
    C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:435: in function <C:\Portables\Far3\Profile\Macros\scripts\MultiPanel.lua:429>

buniak_a_h
Posts: 1921
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

MultiPanel — стек панелей

Post by buniak_a_h »

aflexus, давненько вы тут не были...
Вопрос обсуждался
Лечится заменой
action - <имя_функции>
на
action - function() имя_функции() end
Last edited by buniak_a_h on Mon 20 Jan, 2020 11:06, edited 1 time in total.

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 13 times

MultiPanel — стек панелей

Post by aflexus »

buniak_a_h, ну как бы да, праздники все же :) С Новым Годом :)

А вот как в данном случае вылечить не понимаю. В коде имеем:

Code: Select all

local function HoldMacro(t)
  local action = t.action
  t.action=function()
    far.Timer(10,function(timer,start,key,area)
      local released = ModState(anyCtrl)==0
      if Far.UpTime-start<HoldDelay and not released then return end
      timer:Close()
      mf.postmacro(function()
        if area==Area.Current then
          if released then
            Keys(key)
          else
            --??check condition
            action()
          end
        end
      end)
    end,Far.UpTime,akey(1),Area.Current)
  end
  return Macro(t)
end
И ошибка, видимо, появляется там, где просто "action()". Какое там имя функции не понятно.

buniak_a_h
Posts: 1921
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

MultiPanel — стек панелей

Post by buniak_a_h »

С одной стороны, исправить достаточно легко, заменив во многих (!!!) вызовах panel.функция(p, nil…) на panel.функция(nil, p==ACTIVE and 1 or 0…)
С другой стороны, я не очень понимаю, откуда берётся, например, вызов panel.SetNumericSort. Такое ощущение, что автор использовал какую-то странную версию ФАРа ... В частности, нет у меня функции panel.SetNumericSort.

buniak_a_h
Posts: 1921
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

MultiPanel — стек панелей

Post by buniak_a_h »

Короче, следующая последовательность замен приводит, кажется, к работоспособному варианту (проверял только на закрытии панели, остальное - хорошо бы Вы проверили и написали, если будет вылетать):
  1. заменить
    (panel\.\w*\()p,\s*nil
    на
    $1nil, p==-1 and 1 or 0
  2. заменить
    (panel\.\w*\()p
    на
    $1nil, p==-1 and 1 or 0 (то же самое)
  3. заменить
    (panel\.SetNumericSort)
    на
    --$1

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

У себя я скрипт адаптировал, но пока не выкладываю, поскольку изменения в LuaFAR могут быть не завершены.

Сегодняшний коммит по идее восстанавливает работоспособность и старой версии скрипта: https://github.com/FarGroup/FarManager/ ... 1c0bbc0759

Но пока ещё не факт, что всё останется именно таким образом.

aflexus
Posts: 51
Joined: Sat 12 Mar, 2011 16:57
Has thanked: 13 times

MultiPanel — стек панелей

Post by aflexus »

buniak_a_h, Благодарю за решение - работает.

Кстати "panel.SetNumericSort" у меня в скрипте уже был закомментирован. Судя по заметке, функция пропала где-то с версии 5100.

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

v0.3-alpha

- адаптация к изменениям build 698.
- для шорткатов используется MacroEx.
- для хранения списка панелей используется локальный профиль
- поддержка Scriptsbrowser / cfgscript

Для работы требуется фар 3 build >= 4151, за исключением билдов luamacro 721-722.
(В билде 723 (Far 3 build 5546 от 21.01.2020) используемая функциональность была восстановлена.)
Last edited by John Doe on Tue 21 Jan, 2020 10:56, edited 1 time in total.

DV
Posts: 425
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 22 times
Been thanked: 15 times

MultiPanel — стек панелей

Post by DV »

Наверное, я упускаю какую-то очевидную причину, но:
- почему элементы в списке папок МультиПанели постоянно прыгают вверх-вниз вне моего контроля?
(Я ожидал фиксированный пронумерованный список, в ктором элементы стека не меняют своего положения).

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

Что значит "постоянно прыгают"?
Когда вы переключаетесь на другую панель из стека, то стек изменяется.

Вероятно вас смущает нумерация. Действительно, сейчас её единственное назначение - служить хоткеем, и панели не сохраняют постоянный индекс.
В планах было это изменить.

И в связи с этим вопрос: что делать если панель удалена из середины списка?
Например, в стеке есть "1,2,3,4", и мы удаляем "2". Должны ли панели перенумероваться в "1,2,3", или остаться "1,3,4"?

И после "1,3,4" я так понимаю вновь открытая панель должна заполнить дыру в нумерации?

DV
Posts: 425
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 22 times
Been thanked: 15 times

MultiPanel — стек панелей

Post by DV »

Ага, я понял: я трактую MultiPanel как список вкладок, и для меня неожиданно, что положение элементов в списке меняется. Такое поведение логично для стека, но визуально и логически я ожидаю именно список вкладок, а не стек.
В связи с чем удаление элемента из середины списка - это, с моей точки зрения, закрытие вкладки, ведущее к перенумерации элементов, следующих за тем, который был закрыт. То есть этот вариант - да:
Например, в стеке есть "1,2,3,4", и мы удаляем "2". Должны ли панели перенумероваться в "1,2,3".
Last edited by DV on Fri 24 Jan, 2020 10:56, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12831
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

MultiPanel — стек панелей

Post by John Doe »

DV wrote:
Fri 24 Jan, 2020 10:53
визуально и логически я ожидаю именно список вкладок, а не стек.
В таком случае возможно вам больше подойдёт плагин Panel Tabs.
Но добавлю и себе в список идей на будущее.
DV wrote:
Fri 24 Jan, 2020 10:53
То есть этот вариант - да:
Т.е. при удалении панели из середины списка надо перенумеровывать панели?
Но что если я хочу использовать номера как постоянные шорткаты?

buniak_a_h
Posts: 1921
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 124 times
Been thanked: 183 times
Contact:

MultiPanel — стек панелей

Post by buniak_a_h »

1. Что-то мне кажется, что "стек" (с изменением порядка) очень похож на обычную историю папок, к которой добавили (как, например, в истории команд и просмотров) возможность (а) отметки фаворитных и (б) показ "только фаворитов" (по CtrlH, например). Кстати, по-моему, правильная идея . Не?
2. Для использования в макросах (и просто мышечной памятью пальцев) надо, естественно, номера (и буквы-шоткаты) "закреплять" за папками. Но только это - другой механизм, другая логика и, возможно, другой скрипт. Я так думаю…

Post Reply

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