Code: Select all
test1
test2
testtest, то открыв его я ожидаю что активен будет соответствующий элемент.В реальности активен оказывается первый.
Проблема коренится в функции
int VMenu::FindItem (в апи - также DM_LISTFINDSTRING)Code: Select all
if (Flags&LIFIND_EXACTMATCH)
{
if (equal_icase(strTmpBuf, Pattern))
return static_cast<int>(I);
}
else
{
if (CmpName(Pattern, strTmpBuf, true))
return static_cast<int>(I);
}Code: Select all
diff --git a/far/vmenu.cpp b/far/vmenu.cpp
index d69a4a0ec..dd8ece748 100644
--- a/far/vmenu.cpp
+++ b/far/vmenu.cpp
@@ -3296,7 +3296,7 @@ int VMenu::FindItem(int StartIndex, string_view const Pattern, unsigned long lon
if (Flags&LIFIND_EXACTMATCH)
{
- if (starts_with_icase(strTmpBuf, Pattern))
+ if (equal_icase(strTmpBuf, Pattern))
return static_cast<int>(I);
}
elseLIFIND_EXACTMATCH используется в единственном месте.Что касается апи плагинов, то само название флага намекает на полное совпадение.
Тем не менее в Энциклопедии о флаге
LIFIND_EXACTMATCH дословно сказано следующее:Это тоже не соответствует текущему поведению, сейчас совпадение подстроки ищется строго "с начала".LIFIND_EXACTMATCH: Поле Pattern не является шаблоном - рассматривать как обычную подстроку поиска.
Учитывая разброд и шатание, предлагаю применить исправление на
equal_icase, а в случае необходимости можно добавить флаги, задающие и иное поведение.