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

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

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

Postby John Doe » Tue 09 Apr, 2013 13:02

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

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

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



Требуется FAR3 build 4096 или новее.
Attachments
RecentScreens_r3.9.7z
r3.9 work in progress
(5.13 KiB) Downloaded 114 times

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

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

Postby John Doe » Tue 23 Apr, 2013 21:54

Latest post of the previous page:

Что тут думать, вы безусловно правы в том, что СЕЙЧАС его можно безболезненно отбросить, упростив таким образом выражение.
Но представьте, что там не значение, а переменная switchInstantDefault

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

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

Postby John Doe » Tue 23 Apr, 2013 21:55

Есть подозрение, что опция "задержка меню" избыточна.
И вместо неё стоит сделать что-либо попроще, например:
- появление меню после второго нажатия CtrlTab
- отдельный хоткей для переключения с отображением списка (CtrlCapsLock)
- ...

Какие будут мнения?

Shmuel
Posts: 4911
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 118 times

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

Postby Shmuel » Tue 23 Apr, 2013 21:59

John Doe wrote:Но представьте, что там не значение, а переменная switchInstantDefault

В этом случае согласен.

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

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

Postby IgorZ » Wed 24 Apr, 2013 03:50

John Doe wrote:Есть подозрение, что опция "задержка меню" избыточна.
И вместо неё стоит сделать что-либо попроще, например:
- появление меню после второго нажатия CtrlTab
- отдельный хоткей для переключения с отображением списка (CtrlCapsLock)
- ...

Какие будут мнения?

Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?

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

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

Postby John Doe » Wed 24 Apr, 2013 09:26

IgorZ wrote:Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?
Есть хоткей для открытия меню - CtrlF12. Не оно?

Тогда выключите в настройках отображение списка, и добавьте ещё один макрос на отдельный хоткей (CtrlCapsLock)
  1. Macro { description="[RecentScreens] switch (show list)";
  2.   area=allScreens; key="/^LCtrl(Shift)?CapsLock$/";
  3.   action=function()
  4.     local w = getWindow()
  5.     if w.Type==F.WTYPE_PANELS then Pop(makeUniqueId("Panels",0)) end
  6.     getWindowById:Init()
  7.     if band(w.Flags,F.WIF_MODAL) ~= 0 then showRecentScreens(1,"modal"); return end
  8.     local pos = new_pos(1,akey(1):gsub("CapsLock","Tab"))
  9.     stopMonitoring = true
  10.       pos = showRecentScreens(pos)
  11.       Pos = getWindowById[Screens[pos]].Pos
  12.       Pop(Screens[pos])
  13.       gotoWindow(Pos)
  14.     stopMonitoring = false
  15.     LockState("Caps",0)
  16.   end;
  17. }
Через пару дней сообщите, удобно ли это, и всё ли работает ожидаемым образом.
Есть ещё один момент: после того, как вы начали переключение CtrlTab (без списка), но до того, как вы отпустите Ctrl, вам тоже может понадобиться отобразить меню. CtrlF12 в этом случае сработает, а CtrlCapsLock - нет. Надо ли?

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

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

Postby John Doe » Wed 24 Apr, 2013 10:19

Обнаружилась проблема при переключении между редактором/вьювером с помощью F6.
А потом при выходе из файла и фар падает...

2useven10
Posts: 2836
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 72 times

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

Postby 2useven10 » Wed 24 Apr, 2013 10:23

подробнее можно ?

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

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

Postby John Doe » Wed 24 Apr, 2013 10:28

Установить скрипт, открыть файл, нажать F6, полюбоваться на красное окошко (это мой ассерт, так что нормально), попытаться закрыть файл, получить трап.

Но это ещё не багрепорт, позже дам минимальный макрос для воспроизведения трапа.

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

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

Postby John Doe » Wed 24 Apr, 2013 11:02

1. Если в редакторе нажать F6, то событие VE_READ приходит раньше чем EE_CLOSE.
Во вьювере вероятно аналогично, нажать F6, то событие VE_READ приходит раньше чем EE_CLOSE.

2.Если во время EE_CLOSE/VE_CLOSE вызвать far.AdvControl (F.ACTL_GETWINDOWINFO), то вернётся nil

(Падает в обоих случаях, что вызывает трап ещё не выяснил)

P.S.
Приложил коллекцию сегодняшних трапов, они отличаются
<удалено>

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

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

Postby John Doe » Wed 24 Apr, 2013 11:37

Разобрался.
Проблема вызвана самим выводом сообщений во время событий закрытия редактора/вьювера.
Проявляется только при переходе через F6.
Вот минимум для воспроизведения:
  1. Event{ group="EditorEvent";
  2.   condition=function(id,Event) return Event==far.Flags.EE_CLOSE end;
  3.   action=msgbox
  4. }
  5. Event{ group="ViewerEvent";
  6.   condition=function(id,Event) return Event==far.Flags.VE_CLOSE end;                            
  7.   action=msgbox
  8. }

Любой из этих двух макросов приводит к трапу при выходе из редактора/вьювера.

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Postby t-rex » Wed 24 Apr, 2013 11:41

и само собой до 3348 не повторяется? или это у меня уже паранойя?

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

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

Postby John Doe » Wed 24 Apr, 2013 11:47

Повторяется и раньше (проверил в 3291)

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Postby t-rex » Wed 24 Apr, 2013 11:49

и то хорошо. но вообще при обработке этих эвентов не стоит выводить ничего интерактивного.

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

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

Postby John Doe » Wed 24 Apr, 2013 11:55

t-rex wrote:но вообще при обработке этих эвентов не стоит выводить ничего интерактивного.

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

Проблемы только при переходе через F6.

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

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

Postby IgorZ » Thu 25 Apr, 2013 06:54

John Doe wrote:
IgorZ wrote:Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?
Есть хоткей для открытия меню - CtrlF12. Не оно?

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

Пока, вроде, всё удобно (с учётом моей модификации).
John Doe wrote:Есть ещё один момент: после того, как вы начали переключение CtrlTab (без списка), но до того, как вы отпустите Ctrl, вам тоже может понадобиться отобразить меню. CtrlF12 в этом случае сработает, а CtrlCapsLock - нет. Надо ли?

Для меня это работает как два разных подхода. По CtrlTab я или вообще переключаюсь на автомате, заранее зная, сколько раз нажать надо, или ориентируюсь по содержимому окна. По CtrlCapsLock я переключаюсь, ориентируясь по заголовку окна. У меня эти два разных подхода не пересекаются на практике. Следовательно, вызывать меню для CtrlTab не понадобится.

Кстати, по поводу F6. Нельзя ли назначить на неё макрос, в котором временно отключать события, вызывать Keys("F6"), и снова включать события? Или это я перемудрил?

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

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

Postby John Doe » Thu 25 Apr, 2013 07:26

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

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

Edit:
Вроде работает, сейчас глубже ковырять некогда, поэтому держите полный текст с заплаткой для F6

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

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

Postby John Doe » Sat 27 Apr, 2013 21:57

А при использовании RecentScreens кто как предпочитает переключаться в панели?
CtrlTab или отдельной комбинацией?
Alt0?


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

Who is online

Users browsing this forum: No registered users and 3 guests