Скрипт переключения дисков путем зажатия кнопок Ctrl (для левой панели) или Alt (для правой) и перебора дисков стрелками влево-вправо
Код:
-- -- Переключение дисков по Ctrl/Alt/Shift+<-/-> (c) IgorZ -- v2.2.7 Far 3.0.3209+ -- При нажатии LeftCtrl/RightAlt меняется диск для левой панели, при нажатии RightCtrl/LeftAlt - для правой, -- при нажатии Shift - для активной. -- -- Макрос заменяет анси-плагин Change Active Drive by Ilya V. Gershman -- http://plugring.farmanager.com/plugin.php?pid=21&l=ru -- -- + -- настройки -- - local UseHidden = true -- отрабатывать для скрытой панели local SwitchPanelsOn = 0 -- 0/1/2 - при выключенной панели оставлять выключенной/включать изменяемую/включать обе local UseShift = true -- использовать Shift+стрелки local ExcludeDrives = "" -- диски, исключаемые из списка перехода (в верхнем регистре!) local AltMode = false -- альтернативный режим работы: Ctrl - сменить активный диск, Alt - пассивный -- + -- общие переменные -- - local Key,KeyMod,WPanel -- + -- функции -- - local function cond(key) Key,KeyMod = key,key:match("..%l+") -- запомним клавишу и модификатор WPanel = ( ( not AltMode and (KeyMod=="Ctrl" or KeyMod=="RAlt")==APanel.Left ) or ( AltMode and KeyMod:find("C") ) or ( KeyMod=="Shift" ) ) and APanel or PPanel -- рабочая панель if WPanel.Type~=0 then WPanel = WPanel==APanel and PPanel or APanel end-- если рабочая панель не файловая, переключаем на другой return (CmdLine.Empty or not Key:find("C"))and(WPanel.Visible or UseHidden) -- Ctrl+стрелки - в пустую командную строку, и скрытые панели, если UseHidden? end; -- local function act() -- константы local StdColor = far.AdvControl(far.Flags.ACTL_GETCOLOR,far.Colors.COL_PANELTEXT) -- цвет стандартной надписи local SelColor = far.AdvControl(far.Flags.ACTL_GETCOLOR,far.Colors.COL_PANELCURSOR) -- цвет текущей позиции local StartColor = far.AdvControl(far.Flags.ACTL_GETCOLOR,far.Colors.COL_PANELSELECTEDTEXT) -- цвет начального диска local StartSelColor = far.AdvControl(far.Flags.ACTL_GETCOLOR,far.Colors.COL_PANELSELECTEDCURSOR) -- цвет начального диска, когда текущий local bMods = {Ctrl=0x8,Alt=0x2,RCtrl=0x4,RAlt=0x1,Shift=0x10} -- модификаторы: коды по названию -- local PanelPos = WPanel.Left and 1 or 1+(APanel.Left and APanel.Width or PPanel.Width) -- позиция начала панели дисков local DrvList,DrvNum = "",1 -- заготовка под список дисков в системе, номер текущего диска в списке for i=string.byte("A"),string.byte("Z") do -- заполним список дисков в системе local d = string.char(i) if win.GetDriveType(d..":\\")~="no root directory" and not ExcludeDrives:find(d) then -- если не отсутствует и не исключён DrvList = DrvList..d -- добавим end end if WPanel.Path:sub(2,2)==":" then -- на рабочей панели локальный диск? DrvNum = DrvList:find(WPanel.Path:sub(1,1)) -- его реальный номер в списке else DrvList = "."..DrvList -- добавим в первую позицию условное текущее содержимое панели end local StartDrv = DrvNum -- запомним local h = far.SaveScreen(PanelPos,0,PanelPos+DrvList:len()+2,0) -- сохраним фрагмент экрана, на котором будем рисовать панель смены диска repeat -- Обработаем очередное нажатие стрелки if Key~="" then if Key==(KeyMod.."Left") then DrvNum = DrvNum-1; end if Key==(KeyMod.."MsWheelUp") then DrvNum = DrvNum-1; end if Key==(KeyMod.."Right") then DrvNum = DrvNum+1; end if Key==(KeyMod.."MsWheelDown") then DrvNum = DrvNum+1; end DrvNum = ((DrvNum-1+DrvList:len())%DrvList:len())+1 -- корректировка выхода за начало/конец far.Text(PanelPos,0,StdColor,"["..DrvList.."]") -- отрисуем список дисков far.Text(PanelPos+DrvNum,0,SelColor,DrvList:sub(DrvNum,DrvNum)) -- и курсор far.Text(PanelPos+StartDrv,0,DrvNum~=StartDrv and StartColor or StartSelColor,DrvList:sub(StartDrv,StartDrv)) -- и стартовый диск end Key = mf.waitkey(100) until band(Mouse.LastCtrlState,bMods[KeyMod])==0 far.RestoreScreen(h) -- восстановим испорченный участок экрана if DrvNum~=StartDrv then -- выбрали другой диск? panel.SetPanelDirectory(nil,WPanel==APanel and 1 or 0,DrvList:sub(DrvNum,DrvNum)..":") -- сменим диск для панели if not WPanel.Visible then -- панель скрыта? if SwitchPanelsOn==2 and APanel.Visible==PPanel.Visible then -- обе погашены и обе включить? Keys("CtrlO") elseif SwitchPanelsOn~=0 then --включить одну? if WPanel.Left then Keys("CtrlF1") else Keys("CtrlF2") end -- включим изменяемую панель end end end end; -- + -- Макрос -- - Macro { area="Shell Info QView Tree Search"; key=UseShift and "/.?(Ctrl|Alt|Shift)(Left|Right|MsWheelUp|MsWheelDown)/" or "/.?(Ctrl|Alt)(Left|Right|MsWheelUp|MsWheelDown)/"; description="Переключение дисков по Ctrl/Alt/Shift+Стрелки"; flags="EnableOutput"; condition = cond; action = act; }