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

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

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

Postby 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: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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: 11048
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 10 times
Been thanked: 63 times

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

Postby 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+<-/->

Postby AleXH » Tue 20 May, 2014 09:03

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

IgorZ
Posts: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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: 11048
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 10 times
Been thanked: 63 times

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

Postby 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: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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: 11048
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 10 times
Been thanked: 63 times

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

Postby 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: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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: 11048
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 10 times
Been thanked: 63 times

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

Postby John Doe » Tue 27 May, 2014 10:22

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

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

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

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

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

Postby John Doe » Tue 27 May, 2014 13:12

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

IgorZ
Posts: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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: 11048
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 10 times
Been thanked: 63 times

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

Postby 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: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby 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+<-/->

Postby AleXH » Fri 30 May, 2014 06:46

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

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

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

Postby 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 44 times

IgorZ
Posts: 436
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 5 times
Been thanked: 8 times

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

Postby IgorZ » Fri 11 Jul, 2014 06:24

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

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


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

Who is online

Users browsing this forum: No registered users and 2 guests