Ошибки при получении текста пункта МЕНЮ в результате "Искать все" Topic is solved

Здесь можно сообщить о найденных багах в Far.
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

SOS! SOS! SOS!! :suicide:
В версии примерно 6474 появилась странность, не дающая получить корректную информацию о пункте МЕНЮ
Как воспроизвести:
  1. Открыть в редакторе файл changelog к версии примерно 6475.
  2. Задать поиск строки 6473, «Искать все». Получим МЕНЮ, состоящую из двух пунктов:
    ╔══════════════════ Occurrences: 2, lines: 2 ══════════════════╗ ║ 4│23│ 1. From MZK: continue 6473. ║ ║ 14│39│ MZK 2025-05-03 16:58:59-04:00 - build 6473 ║ ╚══════ Ctrl+Enter F5 Shift+F5 Gray + Ctrl+Up Ctrl+Down ═══════╝
  3. Получить любым способом (макросом, например) значения Menu.GetValue(1) или Menu.Value (стоя на первом пункте). Можно также
    получить дескриптор диалога (напр. hDlg) и выполнить запрос hDlg:send(F.DM_GETDLGITEM, 1)[6].
Первая строка МЕНЮ будет такая:
4 231. From MZK: continue 6473.
Т.е. разделитель между номером строки и номером позиции пропадает, а номер позиции сливается с текстом пункта МЕНЮ.
На самом деле я вообще не нашёл способа получить содержимое первой строки! :bang:
User avatar
HaRT
Moderator
Posts: 11458
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 270 times
Been thanked: 417 times

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by HaRT »

А в сборках 6475 и новее эта особенность сохраняется?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

HaRT wrote: Mon 05 May, 2025 20:22 А в сборках 6475 и новее эта особенность сохраняется?
У меня 6475. Там эта «особенность» присутствует. Новее пока не получал (обновляюсь renewal-ом из Nightly, перенастраивать на гитхаб не хотелось бы)
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

Для определённости проверил на 6477. Особенность присутствует
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by zg »

я не очень понял, в чём ошибка?
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

zg wrote: Mon 05 May, 2025 21:52 я не очень понял, в чём ошибка?
Функция Menu.GetValue(1) должна возвращать текст пункта МЕНЮ:
%FarHome%\Encyclopedia\FarEncyclopedia.ru.chm wrote:S=menu.getvalue([Pos]) Возвращает текст пункта меню с номером Pos.
Текст пункта МЕНЮ - то, что выводится в первом скриншоте. А функция возвращает второй (со слепленным номером позиции и текстом).
На самом деле меня интересует не исправление ошибки, а ответ на вопрос: как получить текст МЕНЮ в этом конкретном случае?
P/S. Если "найденный текст" начинается не с цифры, то слипания не происходит, текст пункта МЕНЮ возвращается нормально. Это настораживает.
PP/S. Другие места (МЕНЮ) не проверял.
PPP/S. Версия 6458 выводила текст пункта МЕНЮ корректно.
Только что выяснил, что перестал работать макрос, который искал следующее вхождение слова под курсором. Я ещё не смотрел, но, возможно, причина одна. Как-то неправильно ради чисто внешнего дизайна (замена разделителя строка:позиция, возможность скрывать номера строк/колонок) портить функционал!
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by zg »

buniak_a_h wrote: Mon 05 May, 2025 22:18Функция Menu.GetValue(1) должна возвращать текст пункта МЕНЮ:
она и возвращает.
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

zg wrote: Tue 06 May, 2025 00:23она и возвращает.
Т.е. Вы утверждаете, что текст первого пункта МЕНЮ
4 231. From MZK: continue 6473.
а перед выводом на экран этот пункт преобразовывается в
4│23│ 1. From MZK: continue 6473.
? Если так, то как получить именно видимое представление пункта МЕНЮ? И каким образом из
4 231.
можно получить
4│23│ 1.
?
Я ещё могу понять, как пробелы превратить в разделители. Но как разбить группу подряд идущих цифр на две группы - это для меня совсем загадка!
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by zg »

buniak_a_h wrote: Tue 06 May, 2025 01:00Вы утверждаете
я не утверждаю, если вы посмотрите коммит 6473, то увидите, что именно это и происходит.
buniak_a_h wrote: Tue 06 May, 2025 01:00то как получить именно видимое представление пункта МЕНЮ
никак. кроме как с экрана прочитать.
buniak_a_h wrote: Tue 06 May, 2025 01:00Но как разбить группу подряд идущих цифр на две группы - это для меня совсем загадка!
колонки фиксированной ширины.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by Kadaner »

Ух! Это поведение -- by design. Для того, чтобы приделать фиксированные колонки со строкой / позицией и скрывать их (чтобы освободить место для содержимого строки), я изменил смысл выражения "текст пункта меню". Теперь это то, что возвращает Menu.GetValue(1). При отрисовке, при помощи небольшой магии, это представление преобразуется в то, что Вы видите на экране. Я намеренно не стал менять имплементацию Menu.GetValue, потому, что мне трудно сказать, что ожидается, поскольку я не пользуюсь этой функциональностью. В каком-то смысле, я ожидал этого вопроса здесь.

Я вижу два способа исправить ситуацию:
  1. Сделать так, чтобы внутреннее представление было таким же, как прежде. Это приведёт к потере (waste) нескольких байт в каждой строке. Я регулярно работаю с меню, содержащими десятки тысяч "пунктов", так что эти байты накапливаются.
  2. Форматировать строку, возвращаемую из Menu.GetValue, по тем же правилам, по которым она форматируется для отрисовки. Этот подход слегка изменит формат результата Menu.GetValue, но, наверное, это легко обработать в макросе.
Что Вы предпочтёте? Я голосую за второй вариант.
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

zg wrote: Tue 06 May, 2025 01:39 колонки фиксированной ширины
Kadaner wrote: Tue 06 May, 2025 01:41 Что Вы предпочтёте?
Я уже сам догадался, что колонки фиксированной ширины, и вопрос потерял актуальность.
Но если уж конкретизировать, что я бы предпочёл, то я либо ввёл бы второй параметр в Menu.GetValue (внутреннее/внешнее значение пункта МЕНЮ), либо другую функцию для внешнего представления. Так-то оба варианта мне не нравятся.
User avatar
HaRT
Moderator
Posts: 11458
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 270 times
Been thanked: 417 times

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by HaRT »

Kadaner wrote: Tue 06 May, 2025 01:41 эти байты накапливаются
Именно накапливаются от вызова к вызову? Или всё-таки просто суммируются для одного показа меню? Если первое, то, похоже, где-то ошибка в обращении с памятью. Если же второе, то, на мой взгляд, это не проблема — чай, не на PC/XT запускаем.
Kadaner wrote: Tue 06 May, 2025 01:41 Что Вы предпочтёте? Я голосую за второй вариант.
Возможно ли сделать так, чтобы старые скрипты и плагины, использующие эти ф-ии, починились (или, соответственно, не сломались, перепрыгнув сразу на исправленную версию Фара)? На мой взгляд, именно это должно быть по умолчанию. А если хочется выставить скриптам/плагинам какое-то другое представление строки меню (какое? зачем?), то следовало бы в Macro API добавить новый параметр, который будет этим управлять, а про Plugin API надо вообще отдельно обсуждать.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4565
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by buniak_a_h »

Kadaner wrote: Tue 06 May, 2025 01:41 Это поведение -- by design
Я понял. Есть замечание-пожелание. Появилась возможность скрывать либо номер позиции, либо оба номера (позиции и строки). НО! Я не нашёл способа запомнить предпочтительный вид. Возможно, недостаточно внимательно читал доки. На самом деле это было бы логично.
Поясню. У меня есть макрос, синхронизирующий положение в списке найденного и положение в редакторе. Поэтому номера становятся не очень нужны. Я бы в настройке (в far:config) вообще выключил бы показ номеров: всё равно видно же.
Last edited by buniak_a_h on Tue 06 May, 2025 03:01, edited 1 time in total.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by Kadaner »

HaRT wrote: Tue 06 May, 2025 02:34 Именно накапливаются от вызова к вызову? Или всё-таки просто суммируются для одного показа меню?
Суммируются, конечно. Предположим, 10 бессмысленных пробелов в каждом из 100000 пунктов меню. Получим 2 мегабайта зря потраченной памяти. Это, конечно, крайний случай, но у меня такое бывает. Можно пережить, но как-то... неаккуратненько.
HaRT wrote: Tue 06 May, 2025 02:34 Возможно ли сделать так, чтобы старые скрипты и плагины, использующие эти ф-ии, починились (или, соответственно, не сломались, перепрыгнув сразу на исправленную версию Фара)
Возможно (я надеюсь). Надо ли соблюсти все размеры с точностью до позиции, или можно "сжать" колонки, убрав по крайней мере несколько пробелов перед номером строки? Если мы точно знаем, что в файле всего 20 строк, зачем тратить 8 позиций на номер строки? И можно ли выравнять номера направо вместо того чтобы "склеивать" их вокруг двоеточия?

Т.е., вместо строки

Code: Select all

"        10:6|Item text"
получится

Code: Select all

"10:     6|Item text"
Двоеточия ведь всё равно не были выравнены по вертикали, так что какой-то разбор этой строки всегда требовался.
User avatar
Kadaner
Posts: 70
Joined: Sun 28 Jan, 2018 05:00
Has thanked: 7 times
Been thanked: 3 times

Ошибки при получении текста пункта МЕНЮ в результате "Искать все"

Post by Kadaner »

buniak_a_h wrote: Tue 06 May, 2025 03:01 Я не нашёл способа запомнить предпочтительный вид.
Это не сделано. Можно добавить. Изменение было и так большое, я предпочёл не усложнять. Кроме того, новые настройки всегда вызывают вопросы (типа, а может не надо?). Давайте обсудим, что хочется. Не затруднит ли Вас создать запрос на новую фичу на GitHub'е?
Post Reply

Return to “Глюки и баги”