RecentScreens — переключение между окнами как в MS Windows™

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

RecentScreens — переключение между окнами как в MS Windows™

Post by John Doe »

В большинстве приложений, которые я использую, переключение между окнами происходит в порядке их использования (MRU order).
Но не во всех, пример исключений: FAR manager, Google Chrome.
Для решения этой проблемы в фаре был когда-то такой плагинчик RecentScreens — меню «Экраны» в порядке использования

Вашему вниманию предлагается LuaMacro-реализация подобной функциональности.

Переключение окон-экранов по умолчанию заменяет LCtrlTab (только левый Ctrl).
В отличии от обычного переключения экранов — в процессе переключения может отображаться список окон (до тех пор, пока удерживается Ctrl).



Требуется FAR3 build 5547 или новее.

[download] https://chiselapp.com/user/johnd0e/repo ... creens.lua
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by t-rex »

Latest post of the previous page:

и то хорошо. но вообще при обработке этих эвентов не стоит выводить ничего интерактивного.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by John Doe »

t-rex wrote:но вообще при обработке этих эвентов не стоит выводить ничего интерактивного.
100%
Но это ведь не пользовательские сообщения, а ошибки.
Что например делать если far.AdvControl (F.ACTL_GETWINDOWINFO) не срабатывает?

Проблемы только при переходе через F6.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Re: RecentScreens — переключение между окнами как в MS Windo

Post by IgorZ »

John Doe wrote:
IgorZ wrote:Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?
Есть хоткей для открытия меню - CtrlF12. Не оно?
Не совсем. Идеальное для меня поведение, выявленное экспериментально - по CtrlTab немедленное переключение по списку без вывода меню, а по CtrlCapsLock вывод меню с переключением после отпускания Ctrl. Сейчас я добился этого путём установки menuDelayDefault в -1 и добавления приведённый макрос трёх строчек (помечены в начале --[[!!]]).
John Doe wrote:Тогда выключите в настройках отображение списка, и добавьте ещё один макрос на отдельный хоткей (CtrlCapsLock)
  1. Macro { description="[RecentScreens] switch (show list)";
  2.  
  3.   area=allScreens; key="/^LCtrl(Shift)?CapsLock$/";
  4.  
  5.   action=function()
  6.  
  7. --[[!!]]    local switchInstantoriginal = switchInstant
  8.  
  9. --[[!!]]    switchInstant = false
  10.  
  11.     local w = getWindow()
  12.  
  13.     if w.Type==F.WTYPE_PANELS then Pop(makeUniqueId("Panels",0)) end
  14.  
  15.     getWindowById:Init()
  16.  
  17.     if band(w.Flags,F.WIF_MODAL) ~= 0 then showRecentScreens(1,"modal"); return end
  18.  
  19.     local pos = new_pos(1,akey(1):gsub("CapsLock","Tab"))
  20.  
  21.     stopMonitoring = true
  22.  
  23.       pos = showRecentScreens(pos)
  24.  
  25.       Pos = getWindowById[Screens[pos]].Pos
  26.  
  27.       Pop(Screens[pos])
  28.  
  29.       gotoWindow(Pos)
  30.  
  31.     stopMonitoring = false
  32.  
  33.     LockState("Caps",0)
  34.  
  35. --[[!!]]    switchInstant = switchInstantoriginal
  36.  
  37.   end;
  38.  
  39. }
Через пару дней сообщите, удобно ли это, и всё ли работает ожидаемым образом.
Пока, вроде, всё удобно (с учётом моей модификации).
John Doe wrote:Есть ещё один момент: после того, как вы начали переключение CtrlTab (без списка), но до того, как вы отпустите Ctrl, вам тоже может понадобиться отобразить меню. CtrlF12 в этом случае сработает, а CtrlCapsLock - нет. Надо ли?
Для меня это работает как два разных подхода. По CtrlTab я или вообще переключаюсь на автомате, заранее зная, сколько раз нажать надо, или ориентируюсь по содержимому окна. По CtrlCapsLock я переключаюсь, ориентируясь по заголовку окна. У меня эти два разных подхода не пересекаются на практике. Следовательно, вызывать меню для CtrlTab не понадобится.

Кстати, по поводу F6. Нельзя ли назначить на неё макрос, в котором временно отключать события, вызывать Keys("F6"), и снова включать события? Или это я перемудрил?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by John Doe »

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

P.S.
В качестве очень временного workaround:
С лёту может не заработать, сейчас не могу протестировать, демонстрирую лишь идею

Edit:
Вроде работает, сейчас глубже ковырять некогда, поэтому держите полный текст с заплаткой для F6
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by John Doe »

А при использовании RecentScreens кто как предпочитает переключаться в панели?
CtrlTab или отдельной комбинацией?
Alt0?
gerser
Posts: 58
Joined: Tue 11 Oct, 2005 20:13
Location: Сургут
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by gerser »

Я из редактора в панели переключался по комбинации Alt`, а из панелей по ней же в редактор в тот, из которого вышел последний раз. Было это во времена 1.7. В 3 хочу также :)
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: RecentScreens — переключение между окнами как в MS Windo

Post by HaRT »

Я без RecentScreens переключаюсь по Alt0 и не вижу, почему с RecentScreens это должно измениться.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Docent1
Posts: 561
Joined: Thu 31 Mar, 2005 23:13
Been thanked: 1 time

Re: RecentScreens — переключение между окнами как в MS Windo

Post by Docent1 »

А можно как-то заменить "Tab" на "`" (это на одну клавишу выше)? Я пробовал в скрипте macroKey = "Tab" заменить на macroKey = "`" но он работает только при CtrlSift`. Просто у меня на Tab повешено сравнение и вроде привык. А вообще бы в идеале клавиша назначается польвователем (но это вряд ли получится - как бы мкрос переписывается)?
Docent1
Docent1
Posts: 561
Joined: Thu 31 Mar, 2005 23:13
Been thanked: 1 time

Re: RecentScreens — переключение между окнами как в MS Windo

Post by Docent1 »

Вопрос снимается: разобрался
Docent1
User avatar
Tim Sobolev
Posts: 729
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 7 times

Re: RecentScreens — переключение между окнами как в MS Windo

Post by Tim Sobolev »

Открываем любой файл на редактирование, для которого в ESC "<lockfile value="on"/>", жмём F6 и вуаля, работать больше нельзя.

Проблемы как со скриптом из шапки, так и с фиксом на этой странице.

User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by John Doe »

Там ошибка, eval(mf.waitkey()) надо исправить на Keys(mf.waitkey())
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

r3.6

Post by John Doe »

Исправлены ошибки, скрипт адаптирован к изменениям билда 4026.

В шапке.
Docent1 wrote:А можно как-то заменить "Tab" на "`" (это на одну клавишу выше)?
Теперь достаточно изменить переменную macroKey в начале файла.
IgorZ wrote:Идеальное для меня поведение, выявленное экспериментально - по CtrlTab немедленное переключение по списку без вывода меню, а по CtrlCapsLock вывод меню с переключением после отпускания Ctrl.
Теперь в комплекте отдельный макрос на CtrlCapsLock, по умолчанию неактивен (NoMacro).

P.S.
В режиме с отображением списка переключение происходит только при отпускании Ctrl (т.е. режим Instant не работает).
Причина: баг, внесённый в билде фара 3847: фаре http://bugs.farmanager.com/view.php?id=1301#c12736
Игорь Юдинцев
Posts: 726
Joined: Sun 03 Apr, 2005 22:00
Location: Казань
Been thanked: 2 times

Re: RecentScreens — переключение между окнами как в MS Windo

Post by Игорь Юдинцев »

John Doe
На вьюверах переключение сбоит. Открываем три файла, жмём и удерживаем Ctrl+Tab так, чтобы файл 1 сменился на файл 2, в появившемся меню выбираем файл 3. Результат: в заголовке консоли видим «просмотр файла 3», на экране по-прежнему просмотр файла 2.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: RecentScreens — переключение между окнами как в MS Windo

Post by John Doe »

Воспроизводится почти всегда при переключении между двумя вьюверами.
Если после этого во вьювере нажать (например) PgUp, то на экране проявляется правильный файл.

Скрипт честно посылает ACTL_SETCURRENTWINDOW и ACTL_COMMIT.
Похоже баг в фаре.

Update
Так и есть, после ACTL_COMMIT неправильно работает VCTL_GETINFO.
Можно убедиться, добавив после строки 78 проверку:
  1. if Area.Viewer and viewer.GetInfo().ViewerID~=far.AdvControl (F.ACTL_GETWINDOWINFO).Id then
  2.  
  3.   error"~="
  4.  
  5. end
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

r3.7

Post by John Doe »

  • Игнорируем окно Desktop
  • Вычурно обходим баги фара
В шапке.
User avatar
Tim Sobolev
Posts: 729
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 7 times

Re: RecentScreens — переключение между окнами как в MS Windows™

Post by Tim Sobolev »

Будет ли возвращена настраиваемая поддержка Desktop Screen и удалены костыли которые были добавлены до применения фиксов в FAR?
Post Reply

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