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

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Возможность фильтрации меню и списков появилась в фаре как экспериментальная, и до логического завершения так и не доведена.
В частности, неудобны такие вещи:
  • для работы с фильтром надо комбинацией клавиш предварительно активировать режим фильтрации.
  • будучи режимным, фильтр не позволяет обычным образом пользоваться шорткатами и клавишей Backspace
В данной теме я предлагаю макросы, позволяющие некоторым образом компенсировать перечисленные недостатки.
(у фильтров в фаре конечно есть и другие проблемы, но их я тут не затрагиваю)
  1. Автофильтр меню — автоматическая активация режима фильтрации в заданных меню.
    • По умолчанию во всех 3х историях, в меню плагинов и их конфигурации, в far:config, в историях полей ввода и кое-где ещё.
    • Комбинация CtrlAltF служит для того чтобы включить или отключить автоматическую активацию для какого-либо меню (или диалога в котором первый фокусный элемент — листбокс).
    • Это возможно в любых меню и диалогах, в том числе плагиновых и созданных скриптом или макросом.
      Для различения меню/списков используется гуид (если определён), или заголовок (если не пустой).
    • Автофильтр можно отдельно активировать для:
      • MainMenu (нажать CtrlAltF в главном меню)
      • Историй полей ввода (открыть историю любого из полей и нажать CtrlAltF, после этого автофильтр будет активироваться во всех историях)
    Минимальный требуемая версия фара: 3.0.3892
  2. Если пункты меню снабжены хоткеями, то очевидно что в режиме фильтрации невозможно ими воспользоваться напрямую (только через Alt, что не совсем привычно).
    Поэтому с помощью макроса я реализовал альтернативное поведение (для режима фильтрации):
    Для активации пункта с каким-либо хоткеем достаточно нажать соответствующую клавишу дважды.
  3. В качестве альтернативы вышеприведённым макросам можно рассмотреть реализацию немодального фильтра меню.
    Помимо всех меню поддерживается работа в автодополнении, в выпадающих и прочих списках.
    • Работает подобно Быстрому Поиску в панелях: для работы с фильтром необходимо удерживать Alt.
    • После отпускания Alt фильтр не сбрасывается. Полностью сбросить можно одиночным нажатием на правый Alt.
      Или же как обычно использовать Backspace (Alt-BS) для посимвольного удаления.
    • Есть поддержка символов, требующих Shift (вряд ли востребовано, слишком много модификаторов).
    • По техническим причинам ввод кириллицы реализован через одно место, но на первый взгляд всё работает.
  4. И для коллекции ещё пара простых макросов:
Last edited by John Doe on Wed 18 Jun, 2025 20:00, edited 1 time in total.
Reason: Обновление MenuAutoFilter.lua
LAT
Posts: 344
Joined: Thu 21 Jan, 2010 20:00
Has thanked: 22 times
Been thanked: 39 times

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

Post by LAT »

Latest post of the previous page:

Я попробовал в SmartMenuFilter.lua после Menu.Filter(lock,1) (строка 54) добавить Menu.Filter(4) ("подправить высоту списка под количество элементов"). Вроде бы стало выглядеть красивше - пустые строки не отображаются. Может, имеет смысл добавить это в оригинальный скрипт? Или пустые строки сделаны специально - чтобы визуально было заметно, что установлен фильтр?
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

LAT wrote: Mon 13 Jan, 2020 21:19 Вроде бы стало выглядеть красивше - пустые строки не отображаются.
В процессе фильтрации количество меню уменьшается, и если мы будем подправлять его высоту, то в результате само положение меню будет вынужено измениться, чтобы вновь оказаться в центре экрана.
Как по мне, то получится очень неудобно.
User avatar
HaRT
Moderator
Posts: 11458
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 270 times
Been thanked: 417 times

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

Post by HaRT »

Использую скрипт MenuAutoFilter.lua из архива в шапке. В меню всё работает ожидаемо, а вот в диалоге far:config при переключении фильтрации по CtrlAltF не возникает характерное сообщение auto filter on/off (в двойной рамочке), и, соответственно, режим фильтрации не сохраняется. Но ведь в шапке заявлена поддержка диалога far:config. Это у меня одного не работает?
Far Manager, version 3.0.5718.0 x86, без прочих плагинов и макросов.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

HaRT wrote: Thu 21 Jan, 2021 15:56 Это у меня одного не работает?
Это что-то в фаре поменялось, посмотрю при случае.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

John Doe wrote: Thu 21 Jan, 2021 16:59 Это что-то в фаре поменялось

Code: Select all

╔═ Bisect Far builds ══╗
║ Far 3.0.5498 is good ║
║ Far 3.0.5500 is bad  ║
╟──────────────────────╢
║   { OK } [ Copy ]    ║
╚══════════════════════╝
P.S. Скачал и проверил 5499, результат = "good". Следовательно, сломалось в 5500.
Last edited by Shmuel on Thu 21 Jan, 2021 17:50, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Shmuel wrote: Thu 21 Jan, 2021 17:21 Bisect Far builds
Магия!
Как вы это делаете?
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

John Doe, спасибо за комплимент. Магии, конечно нет, есть скрипт и есть большая коллекция скачанных за многие годы билдов Фара. Скрипт получает из диалога (или другого скрипта) исходные данные, затем по очереди распаковывает и запускает билды Фара. В автоматическом режиме (не всегда удаётся) решение о том, был ли билд хорошим или плохим принимает сам скрипт. В обычном режиме решение принимает человек после проверки.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Чрезвычайно полезный скрипт для таких случаев, было бы здорово если бы вы им поделились.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

John Doe wrote: Thu 21 Jan, 2021 18:55 Чрезвычайно полезный скрипт для таких случаев, было бы здорово если бы вы им поделились.
Публиковать скрипты/плагины я прекратил - нет времени на поддержку.
Данный скрипт сильно "заточен" на меня (структуры директорий, набор плагинов и т.д)
Вам, без сомнения, по силам написать подобный скрипт.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Shmuel wrote: Thu 21 Jan, 2021 19:19 Вам, без сомнения, по силам написать подобный скрипт
По силам - возможно, но писать я его в обозримом будущем точно не буду. А готовый на одном любопытстве приспособил бы (несмотря на заточенность).
Shmuel wrote: Thu 21 Jan, 2021 19:19 Публиковать скрипты/плагины я прекратил - нет времени на поддержку.
Многие вещи полезны и как есть, без всякой поддержки.

Но как бы там ни было, позицию вашу принимаю.
https://t.me/FarManager — Telegram чат
User avatar
Ann
Posts: 478
Joined: Tue 26 Jun, 2007 11:05
Has thanked: 141 times
Been thanked: 45 times

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

Post by Ann »

Shmuel,
John Doe wrote: Thu 21 Jan, 2021 19:44
Shmuel wrote: Thu 21 Jan, 2021 19:19 Публиковать скрипты/плагины я прекратил - нет времени на поддержку.
Многие вещи полезны и как есть, без всякой поддержки.
Очень приветствую данный тезис. Самокритика и критика постепенно утопнут в Лете, а творческая суть, заложенная в достигнутом Вами результате, даст добротный импульс к расцвету вдохновения последователей. Кроме прочего, где-то на этом форуме или на руборде читал, что у Вас есть несколько макросов для редактора Фара. Выкройте, пожалуйста, всё же немного времени для обнародования Вашего скриптового наследия "как есть". Убеждён, что форумчане помогут сообща разобраться, если вдруг что.
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

Ann, спасибо за высокую оценку моего скромного труда :)
Тем не менее, есть определённые минимальные стандарты публикации, и привести программу к этим стандартам требует времени.
Ну и кроме того, принято решение, и на решение есть причины.
Что касается моих скриптов или плагинов для редактора и прочих - практически всё выложено: на форуме, на гитхабе, на плагринге.
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

John Doe wrote: Thu 21 Jan, 2021 16:59 Это что-то в фаре поменялось, посмотрю при случае.
После рефакторинга в 5500 значение Menu.Id полученное вне меню стало строковым значением - "".
Фикс такой:

Code: Select all

--- MenuAutoFilter2.old
+++ MenuAutoFilter2.lua
@@ -39,7 +39,8 @@
 ----
 local function getListId()
   local noid = "00000000-0000-0000-0000-000000000000"
-  local id = Menu.Id or Dlg.ItemType==F.DI_LISTBOX and Dlg.Id
+  local id = Area.Menu and Menu.Id or
+             Dlg.ItemType==F.DI_LISTBOX and Dlg.Id
   id = id==noid and Object.Title or id --??+Dlg.Owner
   return id~="" and id
          or Area.MainMenu and "MAINMENU"
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7244
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 636 times

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

Post by Shmuel »

John Doe wrote: Fri 22 Jan, 2021 10:33 После рефакторинга в 5500 значение Menu.Id полученное вне меню стало строковым значением - "".
Это любопытно. Проверка показала, что Menu.Id вне меню уже было пустой строкой (ещё до Lua), а стало nil только в одном из билдов диапазона [4693-4695]. Так что, можно сказать, вернулось в исходное состояние.
User avatar
HaRT
Moderator
Posts: 11458
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 270 times
Been thanked: 417 times

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

Post by HaRT »

John Doe wrote: Fri 22 Jan, 2021 10:33Фикс такой:
Теперь работает, спасибо!

И предложение–пожелание: сохранять не только факт включённого фильтра, но и то, какой был фильтр в прошлый раз. Но по умолчанию этот фильтр не выставлять, а применять его только по нажатию, скажем, Backspace при пустом поле фильтра (аналогично AltHistory). Сценарий использования такой: экспериментирую с некой настройкой, пытаясь добиться желаемого поведения; для этого придаю ей разные значения и проверяю поведение — приходится каждый раз, открывая конфигурацию, вводить заново тот же самый фильтр. Тут бы и помогло восстановление запомненного прошлого значения.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

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

Post by John Doe »

Возьму на заметку.
Однако для вашего случая ещё удобнее было бы запоминать позицию в списке, безо всяких фильтров.
https://t.me/FarManager — Telegram чат
Post Reply

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