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

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

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

Post by 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 146 times

Max Rusov
Posts: 3600
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Been thanked: 7 times

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

Post by Max Rusov » Tue 09 Apr, 2013 15:13

Latest post of the previous page:

Макрос AltScreens надо бы доработать - выдает ошибку, если нажать Alt-Цифру, больше чем есть окон.

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

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

Post by John Doe » Tue 09 Apr, 2013 15:36

Как вариант

Code: Select all

condition = function(akey) return tonumber(akey:sub(-1))<#Screens end;
или проверять что Screens закрылся

Code: Select all

if not Area.Menu then Pop(getWindow().UniqueId) end
или использовать Object.CheckHotkey()

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

RecentScreens r1.1

Post by John Doe » Tue 09 Apr, 2013 22:20

r1.1

Поведение RecentScreens можно отрегулировать, изменяя следующие параметры (в самом начале скрипта):
  • modeAutoSwitch (true/false) — переключать окна при каждом перемещении курсора в списке / или при закрытии списка.
  • modeNoMenu (false/true) — отображать / не отображать список на экране.
    Независимо от состояния этого параметра список не будет показан если окна только два.
Работают все 4 комбинации, есть чем поиграться )
Дайте знать, если считаете, что умолчательные параметры не оптимальны, или нужно какое-то другое поведение.

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

RecentScreens r2

Post by John Doe » Mon 15 Apr, 2013 00:37

r2
  • теперь по умолчанию макрос заменяет CtrlTab, а для изменения комбинации на CtrlCapsLock надо использовать параметр в начале скрипта.
  • корректно обрабатываются модальные окна
  • отслеживаются все "внешние" переключения окон, теперь нет необходимости в замене макроса AltScreens.lua (на прошлой странице).
    Ассерты пока оставил, срабатывать по идее не должны, но если что дайте знать.
  • Новая функция: список может появляться с задержкой (и при быстром переключении соответственно отображаться не будет)
Обновлённый список настроек:
  • macroKey = "Tab" | "CapsLock" — здесь можно поменять клавишу для активации переключения
  • menuDelay = 400 | 0 | nil/-1 — задержка (мс) перед отображением списка экранов
    0 — отображать сразу
    nil или -1 — не отображать никогда
  • switchInstant = true | false — переключать окна при каждом перемещении курсора в списке / или после закрытия списка.
Допустимы все сочетания перечисленных параметров.

User avatar
hobo
Posts: 20
Joined: Sun 21 Mar, 2010 08:17

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

Post by hobo » Mon 15 Apr, 2013 05:23

У меня Far 3258. Скопировал RecentScreens.lua в Far3\Profile\Macros\scripts\. При запуске Far предупреждение: ...

Code: Select all

Far3\Profile\Macros\scripts\RecentScreens.lua:55: attempt to index local 'w' (a number value)

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

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

Post by Shmuel » Mon 15 Apr, 2013 06:43

v2 при загрузке макросов:

Code: Select all

...Far Manager\Profile\Macros\scripts\RecentScreens.lua:109: attempt to index field 'Guids' (a nil value)

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

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

Post by John Doe » Mon 15 Apr, 2013 07:33

hobo wrote:У меня Far 3258. Скопировал RecentScreens.lua в Far3\Profile\Macros\scripts\. При запуске Far предупреждение: ...

Code: Select all

Far3\Profile\Macros\scripts\RecentScreens.lua:55: attempt to index local 'w' (a number value)
Нужен хотя бы 3299
Shmuel wrote:v2 при загрузке макросов:

Code: Select all

...Far Manager\Profile\Macros\scripts\RecentScreens.lua:109: attempt to index field 'Guids' (a nil value)
Удалите эту строку local ScreensSwitchId = far.Guids.ScreensSwitchId, она не используется.
Сейчас перезалью...

User avatar
hobo
Posts: 20
Joined: Sun 21 Mar, 2010 08:17

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

Post by hobo » Mon 15 Apr, 2013 09:43

John Doe wrote:Нужен хотя бы 3299
Ламер (I am) юзает только стабильные сборки с тех пор, как он появились

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

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

Post by John Doe » Mon 15 Apr, 2013 11:05

Строку 247 можно модифицировать так:

Code: Select all

    if key~="" or timer(menuDelay) then pos = showRecentScreens(pos);break end
В этом случае меню будет появляться не только по таймеру, но и по второму нажатию Ctrl-Tab.

Можно было бы сделать и такой режим, но не знаю стоит ли, жду отзывов.

AsX
Posts: 17
Joined: Fri 28 Jan, 2011 20:39

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

Post by AsX » Mon 15 Apr, 2013 15:56

Если пробовать переключать окна когда открыт редактор из поиска (Alt-F7, что-то найти, F4 на файле), то вылетает страшное красное окно с ассертом из фyнкции WindowsById. Хоть переключать окна при поиске ФАР и не дает (впрочем с юзерской точки зрения непонятно с какой стати не дает, тоже баг в общем-то), но все-таки пугать красным окном не надо.

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

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

Post by John Doe » Mon 15 Apr, 2013 16:06

Фар свежий?

Ситуация с модальным редактором учитывается, и вылетать ничего не должно.
Воспроизвести не могу.
Скопируйте сюда текст сообщения.

Update
Очевидно у вас старая версия скрипта, в новом такого имени функции просто нет.
Скачайте свежий из шапки (и фар должен быть nightly)

AsX
Posts: 17
Joined: Fri 28 Jan, 2011 20:39

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

Post by AsX » Mon 15 Apr, 2013 16:12

А, я не заметил что скрипт ненавязчиво обновился, у меня старей был. Но какая-то ошибка все равно еасть: если перекючать из той же ситуации (редактор из поиска), то игнорируется "menuDelay = -1" и меню окон всегда показывается.
ЕДИТ: Ща ФАР тоже обновлю.
ЕДИТ2: Обновил, все равно из поиска menuDelay игнорирует.

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

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

Post by John Doe » Mon 15 Apr, 2013 16:21

AsX wrote:Но какая-то ошибка все равно еасть: если перекючать из той же ситуации (редактор из поиска), то игнорируется "menuDelay = -1" и меню окон всегда показывается.
Так и задумано, за это отвечает строка 264: . Можете исправить по своему усмотрению.

Если окон кроме панели нет, то тоже показывается меню, за это отвечает 267

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

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

Post by Shmuel » Mon 15 Apr, 2013 17:27

Есть такой баг:
-- открыты только панели, допустим в папке C:\
-- нажимаем CtrlTab, удерживаем Ctrl -> меню сабжа показывает C:\
-- переходим в какую-либо подпапку, напр. C:\MyDir
-- нажимаем CtrlTab, удерживаем Ctrl -> меню сабжа по-прежнему показывает C:\

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

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

Post by John Doe » Mon 15 Apr, 2013 18:08

Это обрезание так упрощёно работает, строка 198
Пометил себе.

Update
Нет, с обрезанием всё в порядке.
А описанный эффект возникает от того, что курсор стоит на элементе ".."
Нажмите F12, увидите.

Предлагаю такое решение:

Code: Select all

local name = (w.Type==F.WTYPE_PANELS) and APanel.Path.."\\" or w.Name

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

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

Post by Shmuel » Mon 15 Apr, 2013 18:25

John Doe wrote:описанный эффект возникает от того, что курсор стоит на элементе ".."
Нажмите F12, увидите.
F12 показывает элемент под курсором, ему простительно. А сабж показывает текущую папку, независимо от элемента под курсором, следовательно, это - баг.
John Doe wrote:Предлагаю такое решение: [....]
Я абсолютно в код не заглядывал. Мне (как пользователю) надо, чтоб правильно работало.

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

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

Post by John Doe » Mon 15 Apr, 2013 18:40

Вроде я указал как и где можно 'исправить' этот т.н. 'баг', не?

Post Reply

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