Макрос написан по мотивам анси-плагина Change Active Drive by Ilya V. Gershman
Стрелки (или другие назначенные клавиши) в сочетании с LeftCtrl/LeftAlt/RightCtrl/RightAlt/Shift в указанных комбинациях меняют диск для левой/правой/активной/пассивной (в зависимости от настроек) панели. Замечания и предложения принимаются с благодарностью.
Версия 1.0. Начальная.
Версия 1.1. Добавлены опции: использовать/игнорировать Shift/стрелки; игнорировать/обрабатывать
закрытые панели. Не пытаемся обрабатывать нефайловые панели (всё равно смена диска не работает).
Версия 2.0. Переделана логика. Теперь макрос вызывается и работает до конца, а не при каждом
нажатии. Больше нет конфликта с Bookmark (c) Max Rusov и другими макросами, назначенными на отпускание одиночного модификатора. Мелкие правки. Сделана версия для чистого LuaMacro.
Версия 2.1. Небольшая оптимизация алгоритма, переход с mf.* на стандартные средства Lua. Теперь во вложении.
Версия 2.2. Ещё чуть оптимизации. Включаем отключенную панель перед изменением диска для неё. Не меняем диск, если выбрали его же; если на панели не локальный диск, запомним и выведем для него отдельный символ. Возможность исключать отдельные диски из списка. Альтернативный режим управления (Ctrl меняет на активной панели, Alt на пассивной).
Версия 2.2.1 Исправление ошибок. Добавлена настройка включения панели.
Версия 2.2.2 Исправлена ошибка с перерисовкой панели, когда диск не сменился, и ситуация с погашенной панелью.
Версия 2.2.3 Внесена правка в связи со сменой DisableOutput на EnableOutput. Работает как со старым, так и с новым вариантом.
Версия 2.2.4 После очередного рефакторинга Far-а вылезла мелкая, но досадная ошибка с mmode. Исправлена.
Версия 2.2.5 Правка скрипта (использование возможностей, появившихся после его написания), причёсывание. Теперь работает и с плагиновыми панелями, а также в области поиска. Требует версию Far 3.0.3209+.
Версия 2.2.6 Если рабочая панель Info/QView/Tree, то переключаем в другой. Небольшая полировка неровностей.
Версия 2.2.7 Подсвечивается изначальный диск. Оптимизация.
Версия 2.2.7a Экспериментально: изначальный диск не только подсвечивается, но и выводится строчной буквой. Для возврата на него введена клавиатурная комбинация "Home" с текущим модификатором.
Версия 3.0.0 - Настройка скрипта (вызывается по выбору "?" в конце списка, быстрый переход по нажатию "End"), хранение настроек в БД. Скрипт добавлен в меню плагинов. Кроме дисков, можно переходить на плагины. Список плагинов настраивается. Локализация. Добавлена контекстная справка (вызывается везде, даже при переключении дисков). Рефакторинг, исправление ошибок.
Версия 3.0.1 - Добавлено сохранение порядка плагинов в строке. Исправление ошибок.
Версия 3.0.1a- "Опечатка в хелпе: End - позиционирование курсора на ситволе окна конфигурации; необъявленные переменные: FarLang, L"
Версия 3.0.2 - Исправлена ошибка со случаем, когда скрипт стартует с начальным диском, входящим в список исключаемых. Настройка строки вывода мини-панели.
Версия 3.0.3 - Исправлены ошибки в конфигурации: не вызывалась настройка списка плагинов, поправлено окно диалога и русский языковой файл.
Версия 3.0.4 - В меню настройки плагинов: символ пометки "&" корректно отображается, Enter отрабатывает в любой позиции.
Версия 3.0.5 - Выбор символа плагина: при нажатии клавиш и комбинаций с длинными названиями (Ctrl, AltQ, etc) возникала ошибка. Исправлено.
Версия 3.0.6 - Esc - отмена выбора диска, Enter - переход на диск.
Версия 3.0.7 - Рефакторинг работы с плагинами. Мелкие правки.
Версия 3.0.8 - Настройка вывода символов панели с разделением пробелами. Настройка выделения текущего диска нижним регистром. Рефакторинг. Мелкие правки.
Версия 3.1.0 - Более гибкая настройка управления. Переработана справка.
Версия 3.1.1 - Мелкие правки.
Версия 3.2.0 - Максимально гибкая настройка управления. Смена места хранения данных. Мелкие правки.
Версия 3.3.0 - Диски и плагины можно назначать на разные комбинации. После смены клавиш скрипты перезагружаются. Убрана область Menu из определения пункта меню плагинов. При выводе справки используется язык справки фара. Справка допилена. Nfo. Мелкие правки.
Версия 3.3.1 - Нажатие буквы диска/символа плагина перемещает курсор в панели. Изменён способ выделения начального диска в панели. Рефакторинг.
Версия 3.3.2 - Можно указывать несколько строк вывода, панель будет выводиться в каждой.
Версия 4.0.0 - Панели переключения могут быть постоянными и всплывающими при наведении мыши. Рефакторинг.
Версия 4.0.1 - Укрощение курсора в поле "Диски, исключаемые из списка" диалога настроек.
Версия 4.1.0 - Горизонтальная позиция мини-панели настраивается. Скрипт добавляется в меню дисков. Подсказки. Рефакторинг.
Версия 4.1.1 - Исправлена подсказка для конфигурации. Рефакторинг.
Версия 4.1.2 - Исправлена подсказка мини-панели. Дополнена справка о подсказке. Доработан вид меню выбора плагинов в конфигурации. Добавлен показ в подсказке метки тома для дисков. Рефакторинг.
Пункт в меню плагинов зачем-то добавляется и для диалогов (при этом не работает).
А в панелях неплохо бы обрабатывать Esc для отмены.
Кстати сейчас последовательность Esc Enter у меня почему-то гасит панели.
P.S.
И я вообще не очень понимаю какой сценарий применения при вызове из меню плагинов.
Какие преимущества перед AltF1/F2?
IgorZ wrote: Ctrl+Esc и Alt+Esc обрабатывает сама Windows. Так что увы
XKeys позволяет забрать у Windows эту привилегию.
Но при вызове из меню плагинов я не удерживаю ни Alt ни Ctrl, поэтому сейчас речь о просто Esc.
(и что за странный эффект при нажатии Esc Enter)
IgorZ wrote: люди редактируют скрипт, отключая Ctrl/стрелки, чтобы они не мешали изменять размер панелей Far-а. Для тех, кто до сих пор не знает, подсказываю: для этого можно использовать стрелки на цифровой клавиатуре
У меня, например, в „лучшие“ времена было настроено, чтобы стрелки цифровой клавиатуры задвигали панели в указанном направлении до упора (а обычные — штатно, на одну позицию). Т.ч. некоторая актуальность в упоминаемых правках всё же имеется.
Перед Новым Годом привожу выкладки в порядок. Версия 3.0.6 - Esc - отмена выбора диска, Enter - переход на диск. Для нормального использования под Windows необходимо сочетать с XKeys или каким-то аналогом.
В строке 272 скрипт пытается грузить все подряд плагины, что может приводить к ошибкам, в случае если плагин зависит от внешних библиотек, которые находятся в его папке.
╔═════════════════════════════════════════════════════ LuaMacro ═════════════════════════════════════════════════════╗
║ ...acros\scripts\Panels\CtrlAltMenuDisk\CtrlAltMenuDisk.lua:272: cannot load module 'C:\Apps\Far3\Profile\Plugins\ ║
║ Far1x\farmail\bin\farmail.gcc_ssl_minimal.dll': The specified module could not be found.♪ ║
║ ║
║ stack traceback: ║
║ [C]: in function 'load' ║
║ ...acros\scripts\Panels\CtrlAltMenuDisk\CtrlAltMenuDisk.lua:272: in function 'Config' ║
║ ...acros\scripts\Panels\CtrlAltMenuDisk\CtrlAltMenuDisk.lua:357: in function <...acros\scripts\Panels\ ║
║ CtrlAltMenuDisk\CtrlAltMenuDisk.lua:302> ║
╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ { OK } ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
local F = far.Flags
local ffi = require"ffi"
ffi.cdef[[
HMODULE GetModuleHandleW(LPCTSTR lpModuleName);
int GetProcAddress(HMODULE hModule,LPCSTR lpProcName);]]
local C = ffi.C
local function isPanelPlugin(Info)
if band(Info.PInfo.Flags,F.PF_DISABLEPANELS)==0 and far.ForcedLoadPlugin(F.PLT_PATH,Info.ModuleName) then
local ModuleName = win.Utf8ToUtf16(Info.ModuleName.."\0")
local hmod = C.GetModuleHandleW(ffi.cast("void*",ModuleName))
return hmod~=nil and C.GetProcAddress(hmod,"ProcessPanelInputW")~=0
end
end
local ffi = require"ffi"
local plugins = far.GetPlugins()
for i,p in ipairs(plugins) do
local Info = far.GetPluginInformation(p)
ffi.load(Info.ModuleName)
end
for i=1,10 do
for i,p in ipairs(plugins) do
local Info = far.GetPluginInformation(p)
far.ForcedLoadPlugin("PLT_PATH",Info.ModuleName)
end
end
local ffi = require"ffi"
local plugin = far.GetPlugins()[1]
local name = far.GetPluginInformation(plugin).ModuleName
ffi.load(name)
far.ForcedLoadPlugin("PLT_PATH",name)
collectgarbage()
far.GetPluginInformation(plugin)
Минимальный фикс: собрать мусор до реальной загрузки плагина фаром:
local ffi = require"ffi"
local plugin = far.GetPlugins()[1]
local name = far.GetPluginInformation(plugin).ModuleName
ffi.load(name)
collectgarbage()
far.ForcedLoadPlugin("PLT_PATH",name)
far.GetPluginInformation(plugin)
Или же честно использовать LoadLibrary+GetProcAddress+FreeLibrary, как и рекомендовалось изначально.
Но в скрипте я бы тоже кое-что изменил: сейчас все плагины анализируются в момент открытия настроек.
А рациональнее было бы это делать только при нажатии [ Processed plugins ]
Версия 3.0.7 - Рефакторинг работы с плагинами. Мелкие правки.
John Doe wrote:Да, в фаре исправлено.
Но в скрипте я бы тоже кое-что изменил: сейчас все плагины анализируются в момент открытия настроек.
А рациональнее было бы это делать только при нажатии [ Processed plugins ]
Таки сделал. И выгрузку плагинов (спасибо за образец), и перенёс в обработчик [ Processed plugins ].
IgorZ,
- May be a blank space between drives [C D E F..]? Highlighted the current drive in uppercase, not lowercase.
- And a option to show always the drives in two panels?
Something like this:
Mauro72 wrote: Highlighted the current drive in uppercase, not lowercase
How is it now? If [CDEFGhIJKLNS], then it resembles a row of physical buttons, one of them pressed — quite intuitive…
Color highlight would be helpful anyway.