Page 1 of 3

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

Posted: Wed 22 Jan, 2014 16:01
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. И для коллекции ещё пара простых макросов:

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

Posted: Wed 22 Jan, 2014 16:12
by Shmuel
А зачем регулярное выражение key="/^[RL]Ctrl[RL]AltBS$/", почему не просто key="CtrlAltBS" ?

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

Posted: Wed 22 Jan, 2014 16:13
by John Doe
Перемудрил )

P.S.
Перезалил.
"Немодальный фильтр" должен работать не только во всех меню, но и в списках историй, в автодополнении, и прочих выпадающих списках и листбоксах (например в диалоге плагина UpdateEx)

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

Posted: Thu 23 Jan, 2014 16:00
by John Doe
Автоактивацию фильтра можно добавить и в другие меню, например:

А меню File associations я вызываю консольным алиасом ass=lm:post Keys "F9 c a RAlt" print("$*")

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

Posted: Mon 27 Jan, 2014 14:41
by John Doe
Макросы для автоматической активации фильтра в некоторых меню отправлены в отставку.
Вместо этого используется новый скрипт, позволяющий пользователю динамически включать/отключать автофильтр для любого меню/списка (перечень выбранных сохраняется в базе).

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


Шапка обновлена

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

Posted: Thu 30 Jan, 2014 16:39
by John Doe
Автофильтр меню пришлось переделать, теперь он не пытается активироваться на каждом фокусном элементе диалога (это сейчас нельзя сделать как следует, по причине неувязок в FAR API).
  • В диалогах автофильтр можно активировать для листбокса в случае если он является первым фокусным элементом.
  • Отдельно поддерживаются истории полей ввода: автофильтр включается/отключается сразу для всех.
    (ввиду отсутствия поддержки в API используется довольно кривое условие )

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

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

В связи с этим скрипт в очередной раз переделан.
  • Теперь фильтр включается только после нажатия буквы/цифры.
  • Заголовок при пустом фильтре теперь видим, а активность автофильтра индицируется как [] в конце заголовка.
  • MenuAutoFilter.lua теперь отдельным файлом

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

Posted: Sat 08 Mar, 2014 13:14
by John Doe
MenuAutoFilter.lua:
  • Расширен диапазон клавиш, активирующих фильтр (символы с кодом >=32, сочетания с Shift, NumPad)
  • Исправлен баг, при определённых условиях способный вызвать падение плагина (независимо от этого с билда 3821 в фаре появилась защита от таких ошибок)
  • В скрипте используется метод rawhandle (luafar_manual.chm::/285.html), поэтому минимальный требуемый билд фара теперь 3821.

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

Posted: Mon 09 May, 2016 18:19
by HaRT
John Doe wrote: MenuAutoFilter.lua
Спасибо за ещё один удобный скрипт.
Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
А весь фильтр можно было бы удалять, например, по CtrlBS. (Или кто-то захочет задавать длинный фильтр и удалять его по словам?)

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

Posted: Mon 09 May, 2016 19:32
by John Doe
HaRT wrote: Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
Так и должно работать, наверно что-то в фаре изменилось, а я слишком давно не обновлялся...
Проверю всё когда обновлюсь (то же насчёт пожеланий в других темах)

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

Posted: Mon 09 May, 2016 21:35
by John Doe
HaRT wrote: Как сделать, чтобы BS стирал не весь фильтр, а только его последний символ (так же, как в голом Фаре)?
Не воспроизводится, возможно у вас конфликт с каким-то другим макросом.

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

Posted: Mon 09 May, 2016 21:50
by HaRT
John Doe wrote: возможно у вас конфликт с каким-то другим макросом
Вот ведь интересная ситуация выходит: если запускаю Фар без ConcurrentHotkeys или с ключом /p"%FARHOME%\Plugins\LuaMacro" (т.е. без прочих плагинов), то проблема пропадает (проверял в меню плагинов). Что-то я сомневаюсь, что может быть виноват какой-то из не-скриптовых плагинов…

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

Posted: Mon 09 May, 2016 21:59
by John Doe
HaRT wrote: Что-то я сомневаюсь, что может быть виноват какой-то из не-скриптовых плагинов…
но факты намекают..

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

Posted: Mon 09 May, 2016 22:32
by HaRT
John Doe wrote: но факты намекают..
Разобрался, я сам дурак — добавил BS в ConcurrentHotkeys следом за Esc и F10, не подумав толком. Прошу прощения.

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

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