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

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

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

Post by Max Rusov »

Latest post of the previous page:

Макрос AltScreens надо бы доработать - выдает ошибку, если нажать Alt-Цифру, больше чем есть окон.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Как вариант

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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

RecentScreens r1.1

Post by John Doe »

r1.1

Поведение RecentScreens можно отрегулировать, изменяя следующие параметры (в самом начале скрипта):
  • modeAutoSwitch (true/false) — переключать окна при каждом перемещении курсора в списке / или при закрытии списка.
  • modeNoMenu (false/true) — отображать / не отображать список на экране.
    Независимо от состояния этого параметра список не будет показан если окна только два.
Работают все 4 комбинации, есть чем поиграться )
Дайте знать, если считаете, что умолчательные параметры не оптимальны, или нужно какое-то другое поведение.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

RecentScreens r2

Post by John Doe »

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

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

Post by hobo »

У меня 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: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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: 28
Joined: Sun 21 Mar, 2010 08:17

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

Post by hobo »

John Doe wrote:Нужен хотя бы 3299
Ламер (I am) юзает только стабильные сборки с тех пор, как он появились
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

Code: Select all

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

Можно было бы сделать и такой режим, но не знаю стоит ли, жду отзывов.
AsX
Posts: 23
Joined: Fri 28 Jan, 2011 20:39
Been thanked: 2 times

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

Post by AsX »

Если пробовать переключать окна когда открыт редактор из поиска (Alt-F7, что-то найти, F4 на файле), то вылетает страшное красное окно с ассертом из фyнкции WindowsById. Хоть переключать окна при поиске ФАР и не дает (впрочем с юзерской точки зрения непонятно с какой стати не дает, тоже баг в общем-то), но все-таки пугать красным окном не надо.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Фар свежий?

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

Update
Очевидно у вас старая версия скрипта, в новом такого имени функции просто нет.
Скачайте свежий из шапки (и фар должен быть nightly)
AsX
Posts: 23
Joined: Fri 28 Jan, 2011 20:39
Been thanked: 2 times

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

Post by AsX »

А, я не заметил что скрипт ненавязчиво обновился, у меня старей был. Но какая-то ошибка все равно еасть: если перекючать из той же ситуации (редактор из поиска), то игнорируется "menuDelay = -1" и меню окон всегда показывается.
ЕДИТ: Ща ФАР тоже обновлю.
ЕДИТ2: Обновил, все равно из поиска menuDelay игнорирует.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

Если окон кроме панели нет, то тоже показывается меню, за это отвечает 267
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Есть такой баг:
-- открыты только панели, допустим в папке C:\
-- нажимаем CtrlTab, удерживаем Ctrl -> меню сабжа показывает C:\
-- переходим в какую-либо подпапку, напр. C:\MyDir
-- нажимаем CtrlTab, удерживаем Ctrl -> меню сабжа по-прежнему показывает C:\
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

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

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

Code: Select all

local name = (w.Type==F.WTYPE_PANELS) and APanel.Path.."\\" or w.Name
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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

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