Почему в фаре можно открыть множество просмотрщиков и редакторов, а несколько панелей нельзя?
Был когда-то замечательный плагин Multi-panel, реализующий стек панелей.
Существует и более современный PanelTabs, помимо вкладок там есть и меню, напоминающее Multi-panel.
При переходе на far 3 я "потерял" Multi-panel.
А PanelTabs не прижился, т.к. некоторые мелкие но важные детали реализованы не так как мне хотелось бы.
Долго собирался, но мне окончательно надоело мучаться с фаровской парой панелей, поэтому я набросал свой аналог плагина Multi-panel.
При проектировании специально не ориентировался на оригинальный плагин, поэтому отличия должны быть.
Панелей на экране помещается всё так же две, но каждую из них в любой момент можно поместить в MRU-стек, и в любой другой момент достать оттуда в изначальном их состоянии (режим, сортировка, выделение).
Запомнить в стеке можно произвольное число панелей.
Список панелей сохраняется между запусками фара.
Если папка панели в данный момент не существует, то это индицируется (пункт списка серый).
Панели плагинов в основном поддерживаются, а если же панель невозможно сохранить, то это индицируется (пункт списка серый).
Запуск:Ctrl-~ — переключиться между активной и сохранённой, с отображением списка.
Шорткаты в списке (Ctrl должен удерживаться):
Отпустить Ctrl — осуществить переключение в выбранную панель ~/Shift-~ — выбрать следующую/предыдущую сохранённую панель в стеке Enter — осуществить переключение на пассивной панели F3 — клонировать выбранную панель F4 — удалить выбранную панель (если удаляется первая в списке панель, то происходит переключение в следующую)
Комбинации можно переназначить на обычные, но по умолчанию используются возможности MacroEx и для запуска действия необходимо удерживать клавиши (а обычное короткое нажатие по-прежнему вызывает встроенные фаровские команды):
LCtrl-F3 — сохранить активную панель в стек LCtrl-F4 — восстановить из стека предыдущую панель LCtrl-F8 — "закрыть" панель:
Если панель плагиновая, то выходим в реальную.
Если панель реальная, то устанавливаются папка и режимы по умолчанию (DefPanel в коде).
Те же комбинации с дополнительным Shift выполняют аналогичные действия для пассивной панели.
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>
Возможно ли как-то исправить?
MultiPanel — стек панелей
Posted: Thu 29 Mar, 2018 07:46
by John Doe
Достаточно удалить указанную строку (106).
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 10:39
by aflexus
Вновь скрипт сломался. Обновился до 5545 с 5512. Это можно поправить?
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>
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 11:03
by buniak_a_h
aflexus, давненько вы тут не были...
Вопрос обсуждался
Лечится заменой
action - <имя_функции>
на
action - function() имя_функции() end
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 11:58
by aflexus
buniak_a_h, ну как бы да, праздники все же С Новым Годом
А вот как в данном случае вылечить не понимаю. В коде имеем:
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()". Какое там имя функции не понятно.
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 12:45
by buniak_a_h
С одной стороны, исправить достаточно легко, заменив во многих (!!!) вызовах panel.функция(p, nil…) на panel.функция(nil, p==ACTIVE and 1 or 0…)
С другой стороны, я не очень понимаю, откуда берётся, например, вызов panel.SetNumericSort. Такое ощущение, что автор использовал какую-то странную версию ФАРа ... В частности, нет у меня функции panel.SetNumericSort.
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 12:56
by buniak_a_h
Короче, следующая последовательность замен приводит, кажется, к работоспособному варианту (проверял только на закрытии панели, остальное - хорошо бы Вы проверили и написали, если будет вылетать):
заменить (panel\.\w*\()p,\s*nil
на $1nil, p==-1 and 1 or 0
заменить (panel\.\w*\()p
на $1nil, p==-1 and 1 or 0(то же самое)
заменить (panel\.SetNumericSort)
на --$1
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 13:58
by John Doe
У себя я скрипт адаптировал, но пока не выкладываю, поскольку изменения в LuaFAR могут быть не завершены.
Но пока ещё не факт, что всё останется именно таким образом.
MultiPanel — стек панелей
Posted: Mon 20 Jan, 2020 15:23
by aflexus
buniak_a_h, Благодарю за решение - работает.
Кстати "panel.SetNumericSort" у меня в скрипте уже был закомментирован. Судя по заметке, функция пропала где-то с версии 5100.
MultiPanel — стек панелей
Posted: Tue 21 Jan, 2020 10:49
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) используемая функциональность была восстановлена.)
MultiPanel — стек панелей
Posted: Thu 23 Jan, 2020 17:01
by DV
Наверное, я упускаю какую-то очевидную причину, но:
- почему элементы в списке папок МультиПанели постоянно прыгают вверх-вниз вне моего контроля?
(Я ожидал фиксированный пронумерованный список, в ктором элементы стека не меняют своего положения).
MultiPanel — стек панелей
Posted: Fri 24 Jan, 2020 08:15
by John Doe
Что значит "постоянно прыгают"?
Когда вы переключаетесь на другую панель из стека, то стек изменяется.
Вероятно вас смущает нумерация. Действительно, сейчас её единственное назначение - служить хоткеем, и панели не сохраняют постоянный индекс.
В планах было это изменить.
И в связи с этим вопрос: что делать если панель удалена из середины списка?
Например, в стеке есть "1,2,3,4", и мы удаляем "2". Должны ли панели перенумероваться в "1,2,3", или остаться "1,3,4"?
И после "1,3,4" я так понимаю вновь открытая панель должна заполнить дыру в нумерации?
MultiPanel — стек панелей
Posted: Fri 24 Jan, 2020 10:53
by DV
Ага, я понял: я трактую MultiPanel как список вкладок, и для меня неожиданно, что положение элементов в списке меняется. Такое поведение логично для стека, но визуально и логически я ожидаю именно список вкладок, а не стек.
В связи с чем удаление элемента из середины списка - это, с моей точки зрения, закрытие вкладки, ведущее к перенумерации элементов, следующих за тем, который был закрыт. То есть этот вариант - да:
Например, в стеке есть "1,2,3,4", и мы удаляем "2". Должны ли панели перенумероваться в "1,2,3".
MultiPanel — стек панелей
Posted: Fri 24 Jan, 2020 11:59
by John Doe
DV wrote: ↑Fri 24 Jan, 2020 10:53
визуально и логически я ожидаю именно список вкладок, а не стек.
В таком случае возможно вам больше подойдёт плагин Panel Tabs.
Но добавлю и себе в список идей на будущее.
DV wrote: ↑Fri 24 Jan, 2020 10:53
То есть этот вариант - да:
Т.е. при удалении панели из середины списка надо перенумеровывать панели?
Но что если я хочу использовать номера как постоянные шорткаты?
MultiPanel — стек панелей
Posted: Fri 24 Jan, 2020 12:19
by buniak_a_h
1. Что-то мне кажется, что "стек" (с изменением порядка) очень похож на обычную историю папок, к которой добавили (как, например, в истории команд и просмотров) возможность (а) отметки фаворитных и (б) показ "только фаворитов" (по CtrlH, например). Кстати, по-моему, правильная идея . Не?
2. Для использования в макросах (и просто мышечной памятью пальцев) надо, естественно, номера (и буквы-шоткаты) "закреплять" за папками. Но только это - другой механизм, другая логика и, возможно, другой скрипт. Я так думаю…