View Issue Details

IDProjectCategoryView StatusLast Update
0003132Far ManagerFast Findpublic2016-09-22 20:47
ReporterCavalerAssigned To 
PrioritynormalSeverityfeatureReproducibilityalways
Status newResolutionopen 
Product Version 
Target VersionFixed in Version 
Summary0003132: Научить быстрый поиск искать не только с начала файла
DescriptionПредлагается научить быстрый поиск искать введенный текст не с начала имени файла, если файла с такой строкой в начале нет (то есть если текущий вариант ничего не нашел).

Приложен патч с опциональной реализацией такой фичи.

Rationale:

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

nav_addinfo
nav_alarms2
nav_alerts
nav_anchor_watch
...
и так 45 каталогов.

Или например в каталоге с альбомами одной группы:
1970 - Jesus Christ Superstar
1981 - Cats
1987 - The Phantom of the Opera

В таких случаях текущая раелизация малопригодна.
TagsNo tags attached.
Build

Activities

Cavaler

2015-12-14 20:50

reporter  

fast_find_patch.patch (2,908 bytes)
Index: unicode_far/config.cpp
===================================================================
--- unicode_far/config.cpp	(revision 13585)
+++ unicode_far/config.cpp	(working copy)
@@ -188,6 +188,7 @@
 	AutoUpdateLimitItem->Indent(4);
 	AutoUpdateTextItem->Indent(4);
 	Builder.AddCheckbox(MConfigAutoUpdateRemoteDrive, AutoUpdateRemoteDrive);
+	Builder.AddCheckbox(MFastFindSubstring, FastFindSubstring);
 
 	Builder.AddSeparator();
 	Builder.AddCheckbox(MConfigShowColumns, ShowColumnTitles);
@@ -1744,6 +1745,7 @@
 		{FSSF_PRIVATE,       NKeySystem,L"AllCtrlAltShiftRule", OPT_DEF(AllCtrlAltShiftRule, 0x0000FFFF)},
 		{FSSF_PRIVATE,       NKeySystem,L"AutoSaveSetup", OPT_DEF(AutoSaveSetup, false)},
 		{FSSF_PRIVATE,       NKeySystem,L"AutoUpdateRemoteDrive", OPT_DEF(AutoUpdateRemoteDrive, true)},
+		{FSSF_PRIVATE,       NKeySystem,L"FastFindSubstring", OPT_DEF(FastFindSubstring, false)},
 		{FSSF_PRIVATE,       NKeySystem,L"BoxSymbols", OPT_DEF(strBoxSymbols, DefaultBoxSymbols)},
 		{FSSF_PRIVATE,       NKeySystem,L"CASRule", OPT_DEF(CASRule, -1)},
 		{FSSF_PRIVATE,       NKeySystem,L"CloseCDGate", OPT_DEF(CloseCDGate, true)},
Index: unicode_far/config.hpp
===================================================================
--- unicode_far/config.hpp	(revision 13585)
+++ unicode_far/config.hpp	(working copy)
@@ -686,6 +686,7 @@
 	// выше этого количество автоматически не обновлять панели.
 	IntOption  AutoUpdateLimit;
 	BoolOption AutoUpdateRemoteDrive;
+	BoolOption FastFindSubstring;
 
 	StringOption strLanguage;
 	BoolOption SetIcon;
Index: unicode_far/farlang.templ.m4
===================================================================
--- unicode_far/farlang.templ.m4	(revision 13585)
+++ unicode_far/farlang.templ.m4	(working copy)
@@ -2130,6 +2130,18 @@
 "Auto-Aggiorna &Unità Di Rete"
 "Автооновлення м&ережевих дисків"
 
+MFastFindSubstring
+"Б&ыстрый поиск не с начала имени"
+"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+upd:"F&ast find not from name start"
+
 MConfigShowColumns
 "Показывать &заголовки колонок"
 "Show &column titles"
Index: unicode_far/filelist.cpp
===================================================================
--- unicode_far/filelist.cpp	(revision 13585)
+++ unicode_far/filelist.cpp	(working copy)
@@ -3467,6 +3467,11 @@
 		}
 	}
 
+	if (Global->Opt->FastFindSubstring && !Name.empty() && (Name[0] != '*'))
+	{
+		return FindPartName(L"*" + Name, Next, Direct);
+	}
+
 	return FALSE;
 #else
 	// Mantis_698
fast_find_patch.patch (2,908 bytes)

shmuel

2015-12-14 20:55

developer   bugnote:0014125

Может я чего не понял, но если в начале поставить * то ведь ищет по всему имени, не?
Некоторые пользователи ставят макрос, который автоматически вбивает *.

Cavaler

2015-12-14 20:58

reporter   bugnote:0014126

Last edited: 2015-12-14 20:59

View 2 revisions

Без макроса каждый раз вбивать в начало * неудобно, а макросы писать умеют далеко не все.

DrKnS

2015-12-14 21:02

administrator   bugnote:0014127

Макрос можно положить в дистрибутив.

Cavaler

2015-12-15 13:30

reporter   bugnote:0014130

А главное, то, что я предлагаю - слегка отличается в поведении. Поиск в первую очередь с начала имени, и только если не нашлось - с середины.
Как такое сделать макросом - я не представляю.

JohnDoe

2016-07-17 23:40

updater   bugnote:0014669

local function isEmpty()
  mf.clip(5); Keys"CtrlIns"; local str = mf.clip(); mf.clip(5)
  return str==""
end

Macro{
  uid="ADF4D45D-4BE5-4EA2-AB6B-19EFE4E427B2";
  area="Shell";
  key="/[LR]Alt\\w/";
  description="Smart search";
  action=function()
    Keys"AKey"
    if Area.Search and isEmpty() then
      print"*" Keys"AKey"
    end
  end;
}

Cavaler

2016-09-20 15:37

reporter   bugnote:0014781

Повторюсь, функциональносто у макроса, добавляющего звездочку, хуже.

То, что я написал - в первую очередь ищет с начала имени, а если уж не нашлось - то с середины. Это оказалось (ну лично мне) очень-очень удобно.

JohnDoe

2016-09-21 10:45

updater   bugnote:0014782

Cavaler wrote

Повторюсь, функциональносто у макроса, добавляющего звездочку, хуже.
Вы о каком именно макросе?

Cavaler

2016-09-21 11:33

reporter   bugnote:0014783

О вышеприведенном. Все, что он делает - это при нажатии например AltA в строку поиска добавляет "*a", а не просто "a". Разве нет?

zg

2016-09-21 11:41

developer   bugnote:0014784

нет, он делает именно то, что вы просите.

Cavaler

2016-09-21 12:20

reporter   bugnote:0014785

А, ну да, не порсто звездочку добавляет. Но если по первой букве что-то нашлось, а я продолжаю печатать и не находится - то уже ничего не добавляет. Fail.

JohnDoe

2016-09-21 12:52

updater   bugnote:0014786

Cavaler wrote

а я продолжаю печатать и не находится - то уже ничего не добавляет. Fail.
Поясните каково же в таком случае желаемое поведение.

P.S.
Я лично не против патча, и лишь хотел продемонстрировать, что возможности макросов больше, чем может показаться.
(Хотя в данном случае код макроса не слишком прямолинеен, ввиду 0003268)

Cavaler

2016-09-21 13:10

reporter   bugnote:0014788

Желаемое поведение таково.

Если есть файлы с именами, начинающимися с введенной строки - позиционироваться на них.
А если их нет - то та тех, где введенная строка есть хотя бы в середине имени.

Ctrl-Enter перебирает и те, и те.

Так, например, зайтя в \Windows, и начав набирать "temp", я попадаю на каталог Temp, и только нажав Ctrl_Enter - на CbsTemp.

JohnDoe

2016-09-21 13:32

updater   bugnote:0014789

Cavaler wrote

Но если по первой букве что-то нашлось, а я продолжаю печатать и не находится - то уже ничего не добавляет.
Уловил.
Если хочется найти "CbsTemp", а на панели присутствует например "twain_32", то макрос не сработает.

Cavaler wrote

Ctrl-Enter перебирает и те, и те.
А вот это кстати может быть нежелательно..

JohnDoe

2016-09-21 13:41

updater   bugnote:0014790

Last edited: 2016-09-21 13:46

View 3 revisions

local function getSearchStr()
  mf.clip(5); Keys"CtrlIns"; local str = mf.clip(); mf.clip(5)
  return str
end

Macro{
  description="Smart search";
  area="Shell"; key="/[LR]Alt\\w/";
  id="ADF4D45D-4BE5-4EA2-AB6B-19EFE4E427B2";
  action=function()
    Keys"AKey"
    if Area.Search and getSearchStr()=="" then
      print"*" Keys"AKey"
    end
  end;
}

Macro{
  description="Smart search";
  area="Search"; key="/([LR]Alt)?\\w/";
  id="58DE9DD8-21C3-42F7-B997-5E53926219D0";
  action=function()
    local str = getSearchStr()
    Keys"AKey"
    if Area.Search and not str:find"*" and getSearchStr()==str then
      Keys"CtrlY"
      print("*"..str); Keys"AKey"
    end
  end;
}

Macro{
  description="Smart search";
  area="Search"; key="CtrlEnter CtrlShiftEnter";
  id="D983A00F-6FA4-4082-B1B2-87024695916C";
  action=function()
    local str = getSearchStr()
    if not str:find"*" then
      Keys"CtrlY"
      print("*"..str)
    end
    Keys"AKey"
  end;
}


Cavaler

2016-09-21 13:54

reporter   bugnote:0014791

Такой вариант вроде бы работает.
Выложи тогда куда-нибудь этот полет фантазии.

JohnDoe

2016-09-21 14:16

updater   bugnote:0014792

Подумалось, что полёт фантазии может быть намного проще, проверьте
(вместо всех 3х макросов)

Macro{
  description="Smart search";
  area="Shell"; key="/[LR]Alt./";
  id="29EC193E-E253-459E-B37B-DD7DB82C4E62";
  action=function()
    Keys"AKey"
    if Area.Search and akey(1,1)~="*" then
      Keys"CtrlY"
      print"*"
      Keys"AKey"
    end
  end;
}

shmuel

2016-09-22 15:24

developer   bugnote:0014793

Можно ещё на 2 строчки сократить:
Keys("CtrlY * AKey") -- вместо трёх строчек

Issue History

Date Modified Username Field Change
2015-12-14 20:50 Cavaler New Issue
2015-12-14 20:50 Cavaler File Added: fast_find_patch.patch
2015-12-14 20:55 shmuel Note Added: 0014125
2015-12-14 20:58 Cavaler Note Added: 0014126
2015-12-14 20:59 Cavaler Note Edited: 0014126 View Revisions
2015-12-14 21:02 DrKnS Note Added: 0014127
2015-12-15 13:30 Cavaler Note Added: 0014130
2016-07-17 23:40 JohnDoe Note Added: 0014669
2016-09-20 15:37 Cavaler Note Added: 0014781
2016-09-21 10:45 JohnDoe Note Added: 0014782
2016-09-21 11:33 Cavaler Note Added: 0014783
2016-09-21 11:41 zg Note Added: 0014784
2016-09-21 12:20 Cavaler Note Added: 0014785
2016-09-21 12:52 JohnDoe Note Added: 0014786
2016-09-21 13:10 Cavaler Note Added: 0014788
2016-09-21 13:32 JohnDoe Note Added: 0014789
2016-09-21 13:41 JohnDoe Note Added: 0014790
2016-09-21 13:45 JohnDoe Note Edited: 0014790 View Revisions
2016-09-21 13:46 JohnDoe Note Edited: 0014790 View Revisions
2016-09-21 13:54 Cavaler Note Added: 0014791
2016-09-21 14:16 JohnDoe Note Added: 0014792
2016-09-22 15:24 shmuel Note Added: 0014793