SmartMenuFilter — макросы для фильтров меню/списков

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

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Возможность фильтрации меню и списков появилась в фаре как экспериментальная, и до логического завершения так и не доведена.
В частности, неудобны такие вещи:
  • для работы с фильтром надо комбинацией клавиш предварительно активировать режим фильтрации.
  • будучи режимным, фильтр не позволяет обычным образом пользоваться шорткатами и клавишей Backspace
В данной теме я предлагаю макросы, позволяющие некоторым образом компенсировать перечисленные недостатки.
(у фильтров в фаре конечно есть и другие проблемы, но их я пока не затрагиваю)
  1. Автофильтр меню — автоматическая активация режима фильтрации в заданных меню.
    • По умолчанию во всех 3х историях, в меню плагинов и их конфигурации, в far:config, в историях полей ввода и кое-где ещё.
    • Комбинация CtrlAltF служит для того чтобы включить или отключить автоматическую активацию для какого-либо меню (или диалога в котором первый фокусный элемент — листбокс).
    • Это возможно в любых меню и диалогах, в том числе плагиновых и созданных скриптом или макросом.
      Для различения меню/списков используется гуид (если определён), или заголовок (если не пустой).
    • Автофильтр можно отдельно активировать для:
      - MainMenu (нажать CtrlAltF в главном меню)
      - Историй полей ввода (открыть историю любого из полей и нажать CtrlAltF, после этого автофильтр будет активироваться во всех историях)
    Минимальный требуемая версия фара: 3.0.3821
  2. Если пункты меню снабжены хоткеями, то очевидно что в режиме фильтрации невозможно ими воспользоваться напрямую (только через Alt, что не совсем привычно).
    Поэтому с помощью макроса я реализовал альтернативное поведение (для режима фильтрации):
    Для активации пункта с каким-либо хоткеем достаточно нажать соответствующую клавишу дважды.
  3. В качестве альтернативы вышеприведённым макросам можно рассмотреть реализацию немодального фильтра меню.
    Помимо всех меню поддерживается работа в автодополнении, в выпадающих и прочих списках.
    • Работает подобно Быстрому Поиску в панелях: для работы с фильтром необходимо удерживать Alt.
    • После отпускания Alt фильтр не сбрасывается. Полностью сбросить можно одиночным нажатием на правый Alt.
      Или же как обычно использовать Backspace (Alt-BS) для посимвольного удаления.
    • Есть поддержка символов, требующих Shift (вряд ли востребовано, слишком много модификаторов).
    • По техническим причинам ввод кириллицы реализован через одно место, но на первый взгляд всё работает.
  4. И для коллекции ещё пара простых макросов:
Attachments
SmartMenuFilter.7z
8/03/2014
(2.86 KiB) Downloaded 301 times
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: SmartMenuFilter — макросы для фильтров меню/списков

Post by Shmuel »

А зачем регулярное выражение key="/^[RL]Ctrl[RL]AltBS$/", почему не просто key="CtrlAltBS" ?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Перемудрил )

P.S.
Перезалил.
"Немодальный фильтр" должен работать не только во всех меню, но и в списках историй, в автодополнении, и прочих выпадающих списках и листбоксах (например в диалоге плагина UpdateEx)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Автоактивацию фильтра можно добавить и в другие меню, например:

А меню File associations я вызываю консольным алиасом ass=lm:post Keys "F9 c a RAlt" print("$*")
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Макросы для автоматической активации фильтра в некоторых меню отправлены в отставку.
Вместо этого используется новый скрипт, позволяющий пользователю динамически включать/отключать автофильтр для любого меню/списка (перечень выбранных сохраняется в базе).

Автофильтр меню — автоматическая активация режима фильтрации в заданных меню.
  • По умолчанию во всех 3х историях, в меню плагинов и их конфигурации, в far:config и кое-где ещё.
  • Комбинация CtrlAltF служит для того чтобы включить или отключить автоматическую активацию для какого-либо меню, листбокса, или выпадающего списка (предварительно открытого). [пока что не работает, мантис 0002586]
  • Это возможно для любых меню и диалогов, в том числе плагиновых и созданных скриптом или макросом.
    Для различения меню/списков используется гуид (если определён), или заголовок (если не пустой).


Шапка обновлена
Last edited by John Doe on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Добавлена ссылка на тикет
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Автофильтр меню пришлось переделать, теперь он не пытается активироваться на каждом фокусном элементе диалога (это сейчас нельзя сделать как следует, по причине неувязок в FAR API).
  • В диалогах автофильтр можно активировать для листбокса в случае если он является первым фокусным элементом.
  • Отдельно поддерживаются истории полей ввода: автофильтр включается/отключается сразу для всех.
    (ввиду отсутствия поддержки в API используется довольно кривое условие )
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

Если меню открывать сразу с включенным фильтром, то возникает одно неудобство: не будет видно верхнего заголовка, т.к. вместо него отобразится пустой фильтр [].
Поэтому ранее в скрипте была организована задержка включения фильтра, чтобы сохранить заголовок видимым до нажатия какой-либо клавиши (waitkey/eval).
Как по мне этого вполне достаточно, если бы не баг 0002580, который портит некоторые макросы, если их вызывать через eval.

В связи с этим скрипт в очередной раз переделан.
  • Теперь фильтр включается только после нажатия буквы/цифры.
  • Заголовок при пустом фильтре теперь видим, а активность автофильтра индицируется как [] в конце заголовка.
  • MenuAutoFilter.lua теперь отдельным файлом
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

MenuAutoFilter.lua:
  • Расширен диапазон клавиш, активирующих фильтр (символы с кодом >=32, сочетания с Shift, NumPad)
  • Исправлен баг, при определённых условиях способный вызвать падение плагина (независимо от этого с билда 3821 в фаре появилась защита от таких ошибок)
  • В скрипте используется метод rawhandle (luafar_manual.chm::/285.html), поэтому минимальный требуемый билд фара теперь 3821.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

SmartMenuFilter — макросы для фильтров меню/списков

Post by HaRT »

John Doe wrote: MenuAutoFilter.lua
Спасибо за ещё один удобный скрипт.
Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
А весь фильтр можно было бы удалять, например, по CtrlBS. (Или кто-то захочет задавать длинный фильтр и удалять его по словам?)
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Вычеркнуто неактуальное
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

HaRT wrote: Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
Так и должно работать, наверно что-то в фаре изменилось, а я слишком давно не обновлялся...
Проверю всё когда обновлюсь (то же насчёт пожеланий в других темах)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

HaRT wrote: Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
Не воспроизводится, возможно у вас конфликт с каким-то другим макросом.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

SmartMenuFilter — макросы для фильтров меню/списков

Post by HaRT »

John Doe wrote: возможно у вас конфликт с каким-то другим макросом
Вот ведь интересная ситуация выходит: если запускаю Фар без ConcurrentHotkeys или с ключом /p"%FARHOME%\Plugins\LuaMacro" (т.е. без прочих плагинов), то проблема пропадает (проверял в меню плагинов). Что-то я сомневаюсь, что может быть виноват какой-то из не-скриптовых плагинов…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

SmartMenuFilter — макросы для фильтров меню/списков

Post by John Doe »

HaRT wrote: Что-то я сомневаюсь, что может быть виноват какой-то из не-скриптовых плагинов…
но факты намекают..
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

SmartMenuFilter — макросы для фильтров меню/списков

Post by HaRT »

John Doe wrote: но факты намекают..
Разобрался, я сам дурак — добавил BS в ConcurrentHotkeys следом за Esc и F10, не подумав толком. Прошу прощения.
Фар есть инструмент, а не нянька. © 2009 DrKnS
LAT
Posts: 343
Joined: Thu 21 Jan, 2010 20:00
Has thanked: 22 times
Been thanked: 39 times

SmartMenuFilter — макросы для фильтров меню/списков

Post by LAT »

Я попробовал в SmartMenuFilter.lua после Menu.Filter(lock,1) (строка 54) добавить Menu.Filter(4) ("подправить высоту списка под количество элементов"). Вроде бы стало выглядеть красивше - пустые строки не отображаются. Может, имеет смысл добавить это в оригинальный скрипт? Или пустые строки сделаны специально - чтобы визуально было заметно, что установлен фильтр?
Post Reply

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