Переключение дисков по Ctrl/Alt/Shift+<-/->

Здесь выкладываются готовые к использованию макросы и скрипты.
IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Fri 02 Nov, 2012 05:53

Макрос написан по мотивам анси-плагина Change Active Drive by Ilya V. Gershman
Стрелки (или другие назначенные клавиши) в сочетании с LeftCtrl/LeftAlt/RightCtrl/RightAlt/Shift в указанных комбинациях меняют диск для левой/правой/активной/пассивной (в зависимости от настроек) панели. Замечания и предложения принимаются с благодарностью.

Attachments
CtrlAltMenuDisk.3.3.0.7z
последняя версия
(14.95 KiB) Downloaded 30 times
CtrlAltMenuDisk2.0.fmlua.7z
Версия 2.0 - последняя fmlua
(1.54 KiB) Downloaded 28 times
CtrlAltMenuDisk1.1.fmlua.7z
Совсем старая версия (1.1) для версий Фара без Mouse.LastCtrlState
(1.62 KiB) Downloaded 22 times
Last edited by IgorZ on Thu 15 Jun, 2017 09:30, edited 1 time in total.

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Fri 10 May, 2013 20:42

Latest post of the previous page:

Code: Select all

local DrvList = "" -- заготовка под список дисков в системе
local drvs = win.GetLogicalDriveStrings()
for i = 1,#drvs do
  local d = drvs[i]:sub(1,1)
  if not ExcludeDrives:find(d) then  DrvList = DrvList..d end -- если не исключён - добавим
end

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Mon 19 May, 2014 11:39

Версия 2.2.4: Исправлена мелкая, но досадная ошибка с mmode. Вылезла после какого-то из последних рефакторингов. Выложена.

Заодно отвечу (лучше поздно, чем никогда).
John Doe wrote:

Code: Select all

local DrvList = "" -- заготовка под список дисков в системе
local drvs = win.GetLogicalDriveStrings()
for i = 1,#drvs do
  local d = drvs[i]:sub(1,1)
  if not ExcludeDrives:find(d) then  DrvList = DrvList..d end -- если не исключён - добавим
end
1. Проверка дисков на тип ("no root directory") необходима в linux под wine (без неё там вылазит порой куча мусора, что, в частности, мешает переключать вслепую).
2. С вышеуказанной проверкой на быстрых машинах предложенный вариант практически не даёт выигрыша, а на сильно медленных отрабатывает даже медленнее (25 мс против 16).

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Mon 19 May, 2014 11:51

А что там с mmode? Разве вопрос не решается добавлением flags="EnableOutput";?
Ещё замечу что:
- exit() можно смело заменить на return
- Действие макроса можно расширить и на панели Info QView Tree (может и на Search)

AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by AleXH » Tue 20 May, 2014 09:03

onlyVisible и useShift логично было бы сделать логическими переменными true/false

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Mon 26 May, 2014 06:21

Версия 2.2.5: Правка скрипта (использование нововведений, появившихся после его написания, ~700 билдов Far-а назад :bojan: :) ), причёсывание. Теперь работает и с плагиновыми панелями, а также в области поиска. Требует версию Far 3.0.3209+, а не 3.0.3054+, как предыдущая.
John Doe wrote:А что там с mmode? Разве вопрос не решается добавлением flags="EnableOutput";?
Скрипт старенький. Когда он писался, я ещё только изучал Lua (собственно, на нём и изучал), а EnableOutput ещё не было, как и кое-чего другого. Так оно и тянулось. Поправил.
John Doe wrote:- exit() можно смело заменить на return
Можно, но это чистая вкусовщина с моей стороны. Функционально одно и то же, а exit() кажется мне более наглядным. Впрочем, теперь я вынес эту часть в condition, и exit() не нужен.
John Doe wrote:- Действие макроса можно расширить и на панели Info QView Tree (может и на Search)
На Info/QView/Tree не работает - не меняется диск. На Search расширил.
AleXH wrote:onlyVisible и useShift логично было бы сделать логическими переменными true/false
Логично. Сделал.

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Mon 26 May, 2014 07:31

IgorZ wrote:а EnableOutput ещё не было
Но вы это уже исправляли в 2.2.3 ;-)
IgorZ wrote:На Info/QView/Tree не работает - не меняется диск.
При этом пассивная панель ведь файловая, и на ней сменить диск возможно.

Просмотрев скрипт свежим взглядом заметил, что в цикле repeat/until 100 раз в секунду перерисовывается панелька дисков.
(Хотя визуально ничего не дёргается, вероятно фар оптимизирует).

Кстати можно обойтись без EnableOutput, используя far.Text()

P.S.
Ещё несколько мыслей:
- SkipShift можно обработать раньше, в определении макроса.
- Не баг, но функции cond/act правильнее сделать локальными
- В условии cond имхо имеет смысл перенести вычисление WPanel в блок if/else. В ущерб компактности, зато конечный пользователь легче сможет подстроить под сеья желаемое поведение.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Tue 27 May, 2014 05:06

Версия 2.2.6
John Doe wrote:
IgorZ wrote:а EnableOutput ещё не было
Но вы это уже исправляли в 2.2.3 ;-)
Посмотрел имеющийся у меня архив старых версий. Не было такого. Возможно, Вы это у себя самостоятельно правили? А, вспомнил. Я выкинул DisableOutput и вставил mmode, чтобы работала и на старых, и на новых версиях Far-а. Сейчас уже вряд ли нужна совместимость.
John Doe wrote:
IgorZ wrote:На Info/QView/Tree не работает - не меняется диск.
При этом пассивная панель ведь файловая, и на ней сменить диск возможно.
Менять на другой панели? Вроде идея неплохая. Сделал.
John Doe wrote:Кстати можно обойтись без EnableOutput, используя far.Text()
Нельзя. Я почему и заметил ошибку с mmode: после рефакторинга он перестал работать, и панелька дисков вообще не стала отображаться. Точнее, весь вывод на экран стал накапливаться в буфере и выводиться разом, по итогам отработки скрипта, а не сразу в очередной итерации цикла. Пример:
  1. Macro{
  2.   area="Shell";
  3.   key="Ctrl1";
  4. --  flags="EnableOutput";
  5.   action=function()
  6. for i = 1, 10 do
  7.   far.Text(i*2,0,0x0f,i)
  8.   local k = mf.waitkey(1000)
  9. end
  10.   end;
  11. }
Если раскомментировать строчку, работает нормально. Иначе - вываливает всё в конце. Кстати, возможно, это ошибка плагина, но не уверен. Определённая логика в таком поведении есть.
John Doe wrote:- SkipShift можно обработать раньше, в определении макроса.
Логично. Сделал.
John Doe wrote:- Не баг, но функции cond/act правильнее сделать локальными
Банально забыл поставить.
John Doe wrote:- В условии cond имхо имеет смысл перенести вычисление WPanel в блок if/else. В ущерб компактности, зато конечный пользователь легче сможет подстроить под сеья желаемое поведение.
Не понял. Расписать кучей ступенек, примерно так?
  1. WPanel = PPanel
  2. if AltMode then
  3.   if KeyMod:find("C") then
  4.     WPanel = APanel
  5.   end
  6. else
  7.   if KeyMod=="Ctrl" or KeyMod=="RAlt" then
  8.     WPanel = APanel
  9.   end
  10. end

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Tue 27 May, 2014 07:24

IgorZ wrote:А, вспомнил. Я выкинул DisableOutput и вставил mmode, чтобы работала и на старых, и на новых версиях Far-а.
И сделали вы это ещё в 2.2.3, changelog в шапке.
IgorZ wrote:Сейчас уже вряд ли нужна совместимость.
Сильно подозреваю, что с флагом EnableOutput будет работать и в старых версиях.
John Doe wrote:Кстати можно обойтись без EnableOutput, используя far.Text()
  1. repeat -- Обработаем очередное нажатие стрелки
  2.     if Key~="" then
  3.       DrvNum = DrvNum + (Key==(KeyMod.."Right") and 1 or -1)
  4.       local len = DrvList:len()
  5.       DrvNum = DrvNum==0 and len or DrvNum>len and 1 or DrvNum -- корректировка выхода за начало/конец
  6.       far.Text(DrvStart,0,far.AdvControl(GetColor,StdColor),"["..DrvList.."]") -- отрисуем список дисков
  7.       far.Text(DrvStart+DrvNum,0,far.AdvControl(GetColor,SelColor),DrvList:sub(DrvNum,DrvNum)) -- и курсор
  8.       far.Text()
  9.     end
  10.     Key = mf.waitkey(10)
  11.   until band(Mouse.LastCtrlState,bMods[KeyMod])==0
Это просто для информации, я не утверждаю что тут есть хоть какие-то преимущества перед EnableOutput.

IgorZ wrote:
John Doe wrote:- В условии cond имхо имеет смысл перенести вычисление WPanel в блок if/else. В ущерб компактности, зато конечный пользователь легче сможет подстроить под сеья желаемое поведение.
Не понял. Расписать кучей ступенек, примерно так?
Я бы сделал так:
  1. local function cond(key)
  2.   Key,KeyMod = key,key:match("..%l+") -- запомним клавишу и модификатор
  3.   if Key:find("Ctrl") and not CmdLine.Empty then return end -- Ctrl/стрелки отдаём в командную строку, если не пуста
  4.  
  5.   if AlternativeMods then
  6.     WPanel = KeyMod:find("Ctrl") and APanel or PPanel
  7.   else
  8.     if KeyMod=="Shift" then
  9.       WPanel = APanel
  10.     else
  11.       WPanel = (KeyMod=="Ctrl" or KeyMod=="RAlt")==APanel.Left and APanel or PPanel
  12.     end
  13.   end
  14.  
  15.   return not OnlyVisible or WPanel.Visible
  16. end

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Tue 27 May, 2014 09:51

John Doe wrote:
John Doe wrote:Кстати можно обойтись без EnableOutput, используя far.Text()
Это просто для информации, я не утверждаю что тут есть хоть какие-то преимущества перед EnableOutput.
Ага, понял (про этот нюанс far.Text() я, если честно, просто забыл). Недостаток: дополнительный исполняющийся в цикле код. По факту несущественно, но вообще следует избегать.
John Doe wrote:Я бы сделал так:
А смысл? Проще не стало. Если кому надо разобраться в работе и/или переделать - и так справится. Может, я что-то недопонимаю?

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Tue 27 May, 2014 10:22

IgorZ wrote:Недостаток: дополнительный исполняющийся в цикле код. По факту несущественно, но вообще следует избегать.
В предложенном варианте код выполняется вовсе не в цикле, а только по факту нажатия.
В вашем же да, 100 раз в секунду исполняется значительный объём ненужного кода (вчера уже писал об этом: незачем вызывать функции вывода на экран если ничего не изменилось).
Плюс, цвета можно сразу запомнить (даже до макроса), и не вычислять для каждой итерации заново.
IgorZ wrote:А смысл? Проще не стало. Если кому надо разобраться в работе и/или переделать - и так справится. Может, я что-то недопонимаю?
Идиома a = b or c это действительно просто.
А разбирать двустрочное нагромождение логических выражений это уже задача.

P.S.
Разумеется ваш вариант вполне корректен, и в компактности записи есть своя прелесть.

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Tue 27 May, 2014 13:12

Закомментировал вызов panel.RedrawPanel и ничего не изменилось.
Видимо лишний.

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Wed 28 May, 2014 04:52

Версия 2.2.7: подсвечивается начальный диск, оптимизация всего, что попалось на глаза.
John Doe wrote:
IgorZ wrote:Недостаток: дополнительный исполняющийся в цикле код. По факту несущественно, но вообще следует избегать.
В предложенном варианте код выполняется вовсе не в цикле, а только по факту нажатия.
В вашем же да, 100 раз в секунду исполняется значительный объём ненужного кода (вчера уже писал об этом: незачем вызывать функции вывода на экран если ничего не изменилось).
Мы о разном. Насчёт исполнения в цикле, согласен, поправлю, но я о другом: в коде в цикле стоит и выполняется оператор, который не выполняет асолютно никакой полезной работы (при наличии EnableOutput или, как раньше, mmode(1,0)).
Кстати,
  1. DrvNum = DrvNum + (Key==(KeyMod.."Right") and 1 or -1)
- некорректно. mf.waitkey может ввести любую клавишу. Получится, что всё нажатое, кроме KeyMod.."Right" будет работать, как KeyMod.."Left". Ну это так, придирки.
John Doe wrote:Плюс, цвета можно сразу запомнить (даже до макроса), и не вычислять для каждой итерации заново.
Тут согласен, заодно добавлю подсветку начального диска (полезно, если рабочая панель погашена).
John Doe wrote:
IgorZ wrote:А смысл? Проще не стало. Если кому надо разобраться в работе и/или переделать - и так справится. Может, я что-то недопонимаю?
Идиома a = b or c это действительно просто.
А разбирать двустрочное нагромождение логических выражений это уже задача.
P.S.
Разумеется ваш вариант вполне корректен, и в компактности записи есть своя прелесть.
Ради эксперимента отформатировал выражение, не меняя его (только скобок добавил для единообразия. Насколько изменилась читабельность?
John Doe wrote:Закомментировал вызов panel.RedrawPanel и ничего не изменилось.
Видимо лишний.
Рудимент от тех времён, когда не использовал far.SaveScreen/far.RestoreScreen. Убрал.

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Wed 28 May, 2014 09:36

IgorZ wrote:Мы о разном. Насчёт исполнения в цикле, согласен, поправлю, но я о другом: в коде в цикле стоит и выполняется оператор, который не выполняет асолютно никакой полезной работы (при наличии EnableOutput или, как раньше, mmode(1,0)).
Во-первых, "в цикле" предполагает какое-то существенное число повторений, у нас же только по нажатию клавиши.
Во-вторых, я вовсе не предлагал добавлять вызов far.Text() при включённом флаге EnableOutput.
Что касается полезной работы, то следует учитывать, что при EnableOutput ведь тоже выполняется дополнительная работа, хоть и неявно.

Для информации:
IgorZ wrote:заодно добавлю подсветку начального диска (полезно, если рабочая панель погашена).
Предлагаю подсвечивать тут не фон, а текст, а то похоже на второй курсор.
IgorZ wrote:Ради эксперимента отформатировал выражение, не меняя его (только скобок добавил для единообразия. Насколько изменилась читабельность?
Не особо изменилась. А утрата компактности имхо вообще лишила смысла использование этой идиомы.
Кстати, вот где ещё её можно использовать:

Code: Select all

if WPanel.Left then Keys("CtrlF1") else Keys("CtrlF2") end

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Fri 30 May, 2014 05:52

Версия 2.2.7a: Экспериментально: изначальный диск не только подсвечивается, но и выводится строчной буквой. Для возврата на него введена клавиатурная комбинация "Home" с текущим модификатором.
John Doe wrote:
IgorZ wrote:заодно добавлю подсветку начального диска (полезно, если рабочая панель погашена).
Предлагаю подсвечивать тут не фон, а текст, а то похоже на второй курсор.
В скрипте используются стандартные цвета текущей раскраски Far-а. В частности, для кусора - цвета курсора, а для начального диска - цвета выделенного файла (или, соответственно, выделенного файла под курсором). Так что, если у Вас буква начального диска на фоне другого цвета, значит, так настроен Ваш Far (Параметры/Цвета/Панель/Выбранный текст и Выделенный курсор).
В текущей версии для пробы дополнил выделение текущего диска размером буквы (у меня раскраска настроена так, что выбранные файлы выделяются только галкой, а цветом нет, так что выделение диска цветом у меня не работает). Все диски - заглавными буквами, а изначальный - строчной. Если интересно, можно попробовать вариант наоборот: все строчными, а начальный - заглавной. Для этого надо раскомментировать все строки, у которых в комментарии стоит "!!lower" и закоментировать предыдущие. Лично мне не понравилось, но на вкус и цвет все фломастеры разные.

AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by AleXH » Fri 30 May, 2014 06:46

Я себе сделал так: фон синий (стандартная схема), все буквы заглавные, голубые на синем, исходный диск жёлтый на синем, выбираемый диск жёлтый на красном.

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

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by John Doe » Fri 04 Jul, 2014 19:43

Подумалось, что неплохо бы добавить на линейку дисков и плагины.

Для иллюстрации (довольно топорно) модифицировал CtrlAltMenuDisk2.2.7.
В начале файла можно задать список плагинов (guid каждого, символ для каждого, и главное: строку определяющую какие плагины и в каком порядке будут выводится: ).

(Если автору идея не понравится, то выделю в отдельную тему)

P.S.
SameFolder пока меняет папку на пассивной панели, а не на выбранной. Но и нормально сделать не сложно. Как собственно и добавить на линейку не только плагин, а вообще произвольную пользовательскую функцию (если это вообще кому-то интересно).
Attachments
CtrlAltMenuDisk2.2.7+Plugins.7z
(2.76 KiB) Downloaded 49 times

IgorZ
Posts: 463
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 6 times
Been thanked: 9 times

Re: Переключение дисков по Ctrl/Alt/Shift+<-/->

Post by IgorZ » Fri 11 Jul, 2014 06:24

John Doe wrote:Подумалось, что неплохо бы добавить на линейку дисков и плагины.

).
(Если автору идея не понравится, то выделю в отдельную тему)
Автору идея нравится. Автор благодарен за неё и обязательно воспользуется ей, как только найдёт время. Но сейчас у автора завал на работе, ремонт дома и допиливание LuaManager (рефакторинг, поддержка .moon, и т.д.) в остатки свободного времени в процессе. Так что это попозже (вероятно, в августе), ладно?
Last edited by IgorZ on Fri 11 Jul, 2014 06:24, edited 1 time in total.
Reason: Спрятано избыточное цитирование

Post Reply

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