-------------------------------------------------------------------------------
-- Быстрый поиск в редакторе. © SimSU
-------------------------------------------------------------------------------
---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Editor_QuickSearch.cfg
return{
Prior=52;
KeyForward="RAlt"; --PriorForward=50;
KeyBack="RCtrl"; --PriorBack=50;
KeyBS="BS"; --PriorBS=50;
KeyNext="CtrlEnter"; PriorNext=51;
KeyStop="RAlt RCtrl Esc"; --PriorStop=50;
KeyNextWord="CtrlAltDown"; --PriorNextWord=50;
KeyPrevWord="CtrlAltUp"; --PriorPrevWord=50;
VeryQuick=true; -- Очень быстрый поиск :)
CaseSensitivity=false; -- Учитывать регистр.
ThatWord="[%w_]+"; -- Что считается словом.
SelectFound=true; -- Надо ли отмечать найденное -- BAX
}
-- Конец файла Profile\SimSU\Editor_QuickSearch.cfg
end
---- Локализация
local lang=_G.Far.GetConfig('Language.Help') or far.lang or win.GetEnv("farlang") -- BAX
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
--if far.lang=="Russian" then -- BAX
if lang=="Russian" then -- BAX
-- Начало файла Profile\SimSU\Editor_QuickSearchRussian.lng
return{
Descr="Быстрый поиск в редакторе. © SimSU";
DescrForward="Быстрый поиск вперед в редакторе. © SimSU";
DescrBack="Быстрый поиск назад в редакторе. © SimSU";
DescrBS="Быстрый поиск в редакторе - корректировка. © SimSU";
DescrNext="Быстрый поиск в редакторе - следующее совпадение. © SimSU";
DescrStop="Быстрый поиск в редакторе - прекратить. © SimSU";
DescrNextWord="Быстрый поиск в редакторе - следующее слово. © SimSU";
DescrPrevWord="Быстрый поиск в редакторе - предыдущее слово. © SimSU";
}
-- Конец файла Profile\SimSU\Editor_QuickSearchRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Editor_QuickSearchEnglish.lng
return{
Descr="Quick search in the editor. © SimSU";
DescrForward="Быстрый поиск вперед в редакторе. © SimSU";
DescrBack="Быстрый поиск назад в редакторе. © SimSU";
DescrBS="Быстрый поиск в редакторе - корректировка. © SimSU";
DescrNext="Быстрый поиск в редакторе - следующее совпадение. © SimSU";
DescrStop="Быстрый поиск в редакторе - прекратить. © SimSU";
DescrNextWord="Быстрый поиск в редакторе - следующее слово. © SimSU";
DescrPrevWord="Быстрый поиск в редакторе - предыдущее слово. © SimSU";
}
-- End of file Profile\SimSU\Editor_QuickSearchEnglish.lng
end end
-- BAX {
--local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_QuickSearch"..far.lang..".lng") or Messages)()
--local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Editor_QuickSearch.cfg") or
-- loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_QuickSearch.cfg") or
-- Settings)()
local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_QuickSearch"..lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Editor_QuickSearch.cfg") or
loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_QuickSearch.cfg") or
Settings)()
-- BAX }
local SimSU=SimSU or {}
SimSU.Editor_QuickSearch={}
-------------------------------------------------------------------------------
local QSearch,StartLine,StartPos, ColoredLine -- BAX Direction инициализируетс в следующей строке
local Direction=1 -- BAX
local ThatWord=S.ThatWord or "[%w_]+"
local _ThatWord="^("..ThatWord..")"
local ThatWord_="("..ThatWord..")$"
function SimSU.Editor_QuickSearch.Find(txt,Line,Pos,Dir, bWordOnly)
if txt and txt:len()>0 then
local Q=S.VeryQuick and 1 or 0
txt= S.CaseSensitivity and txt or txt:upper()
Line= Line or Editor.CurLine
Pos= Pos or Editor.RealPos
Dir= Dir or Direction or 1
if bWordOnly then Pos = Pos+Dir end
local Case= S.CaseSensitivity and 1 or 0
local str=editor.GetString(nil,Line,3)
local Beg
local Cont=true
while Cont do
Cont = false
Beg= Dir==1 and mf.index(str:sub(Pos+Q),txt,Case)+1 or mf.rindex(str:sub(1,Pos-Q+(txt and txt:len()-1 or 0)),txt,Case)+1
if Beg~=0 then
Beg= Dir==1 and Beg+Pos-1+Q or Beg
else
for i=Line+Dir,Dir==1 and Editor.Lines or 1, Dir do
str=editor.GetString(nil,i,3)
Beg= Dir==1 and mf.index(str,txt,Case)+1 or mf.rindex(str,txt,Case)+1
if Beg~=0 then Line=i; break end
end
end
if bWordOnly and (Beg~=0) then
if ( (Beg > 0) and (str:sub(Beg-1,Beg-1):match('[%w_]') ) ) or
( (Beg <= str:len()-txt:len()) and (str:sub(Beg+txt:len(),Beg+txt:len()):match('[%w_]') ) )
then
if Dir==1 then
Pos = Beg + 1
if Pos > str:len() then
Pos = 1
Line = Line + 1
if Line <= Editor.Lines then
str = editor.GetString(nil, Line, 3)
else
break
end
end
else -- Dir==-1
Pos = Beg - 1
if Pos == 0 then
Line = Line - 1
if Line > 0 then
str = editor.GetString(nil, Line, 3)
Pos = str:len()
else
break
end
end
end
Cont = (Line > 0) and (Line <= Editor.Lines)
Beg = Cont and Beg or 0
end -- Не слово
end -- if bWordOnly and (Beg ~= 0)
end -- while Cont
if Beg~=0 then
if S.SelectFound then
editor.Select(nil,1,Line,Beg,txt:len(),1)
else
--editor.AddColor(nil, Line, Beg, Beg+txt:len()-1, ECF_AUTODELETE, 0x0f)
editor.AddColor(nil, Line, Beg, Beg+txt:len()-1, ECF_AUTODELETE, 0x5f)
ColoredLine = Line
end
editor.SetPosition(nil,Line,Beg)
editor.Redraw()
return true
else
if S.SelectFound then
Editor.Sel(4)
else
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
end
far.Message('Образец не найден','Поиск "'..txt..'"', nil, 'w')
return false
end
end
bDeb = false
end
function SimSU.Editor_QuickSearch.Go(Rec)
if ColoredLine then
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
end
if QSearch == nil then return end
local Key=far.InputRecordToName(Rec)
if Key == "BackSlash" then Key = '\\' end
if (Key=="\01") or (Key == nil) then return end -- Глючит far InputRecordToName возвращает при отпускании модификаторов...
if Key=="Space" then Key=" " end
if Key and Key:len()==1 then
QSearch=QSearch..Key
Editor.SetTitle((Direction==1 and "↓:" or "↑:")..QSearch)
if S.SelectFound then
Editor.Sel(4)
else
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
end
if not SimSU.Editor_QuickSearch.Find(QSearch) then
QSearch = QSearch:sub(1,QSearch:len()-1)
Editor.SetTitle((Direction==1 and "↓:" or "↑:")..QSearch)
-- SimSU.Editor_QuickSearch.Stop()
end
return 1
elseif not((Key=="Ctrl" or Key=="RCtrl" or Key=="Alt" or Key=="RAlt" or Key=="Shift")) then
--QSearch=nil; Editor.SetTitle("")
SimSU.Editor_QuickSearch.Stop()
end
end
function SimSU.Editor_QuickSearch.Stop()
QSearch=nil
Editor.SetTitle("")
if not S.SelectFound then
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
end
end
function SimSU.Editor_QuickSearch.Forward()
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
QSearch=""
Direction=1
Editor.SetTitle("↓:")
StartLine=Editor.CurLine
StartPos=Editor.RealPos
end
function SimSU.Editor_QuickSearch.Back()
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
QSearch=""
Direction=-1
Editor.SetTitle("↑:")
StartLine=Editor.CurLine
StartPos=Editor.RealPos
end
function SimSU.Editor_QuickSearch.BS()
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
if QSearch:len()>0 then
QSearch=QSearch:sub(1,-2)
Editor.SetTitle((Direction==1 and "↓:" or "↑:")..QSearch)
SimSU.Editor_QuickSearch.Find(QSearch,StartLine,StartPos)
if QSearch:len()==1 then
if S.SelectFound then Editor.Sel(4)
end
end
else
SimSU.Editor_QuickSearch.Stop()
if S.SelectFound then Editor.Sel(4) end
end
end
function SimSU.Editor_QuickSearch.Next()
editor.DelColor(nil, ColoredLine)
ColoredLine = nil
--SimSU.Editor_QuickSearch.Find(QSearch)
-- txt, Line, Pos, Dir
local Pos=Editor.RealPos
if Direction==-1 then
Pos = Pos - (S.VeryQuick and 0 or QSearch:len())
else
Pos = Pos+(S.VeryQuick and 0 or 1)
end
if not SimSU.Editor_QuickSearch.Find(QSearch, nil, Pos ) then
SimSU.Editor_QuickSearch.Stop()
end
end
function SimSU.Editor_QuickSearch.GetWord(Line,Pos)
local Line= Line or Editor.CurLine; local Pos= Pos or Editor.RealPos
local s=editor.GetString(nil,Line,3)
local b,e = s:cfind(_ThatWord,Pos); Pos= e or Pos-1
local b,e,w=s:sub(1,Pos):cfind(ThatWord_); return w,b,e
end
function SimSU.Editor_QuickSearch.NextWord()
SimSU.Editor_QuickSearch.Stop()
--local Word = Editor.SelValue~="" and Editor.SelValue or SimSU.Editor_QuickSearch.GetWord()
local Word = SimSU.Editor_QuickSearch.GetWord()
--SimSU.Editor_QuickSearch.Find(Word)
SimSU.Editor_QuickSearch.Find(Word, nil, nil, 1, true)
end
function SimSU.Editor_QuickSearch.PrevWord()
SimSU.Editor_QuickSearch.Stop()
--local Word = Editor.SelValue~="" and Editor.SelValue or SimSU.Editor_QuickSearch.GetWord()
local Word = SimSU.Editor_QuickSearch.GetWord()
SimSU.Editor_QuickSearch.Find(Word, nil, nil, -1, true)
end
-------------------------------------------------------------------------------
if not Macro then return {Editor_QuickSearch=SimSU.Editor_QuickSearch} end
local ok, mod = pcall(require,"SimSU.Editor_QuickSearch"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------
Event {group="EditorInput"; priority=S.Prior; description=M.Descr;
condition=function(Rec) return (QSearch or ColoredLine) and Rec.KeyDown end;
action=SimSU.Editor_QuickSearch.Go;
}
Macro {area="Editor"; key=S.KeyForward; priority=S.PriorForward; description=M.DescrForward;
condition=function() return not QSearch end;
action=SimSU.Editor_QuickSearch.Forward;
}
Macro {area="Editor"; key=S.KeyBack; priority=S.PriorBack; description=M.DescrBack;
condition=function() return not QSearch end;
action=SimSU.Editor_QuickSearch.Back;
}
Macro {area="Editor"; key=S.KeyBS; priority=S.PriorBS; description=M.DescrBS;
condition=function() return QSearch end;
action=SimSU.Editor_QuickSearch.BS;
}
Macro {area="Editor"; key=S.KeyNext; priority=S.PriorNext; description=M.DescrNext;
condition=function() return QSearch end;
action=SimSU.Editor_QuickSearch.Next;
}
Macro {area="Editor"; key=S.KeyStop; priority=S.PriorStop; description=M.DescrStop;
condition=function() return QSearch end;
action=SimSU.Editor_QuickSearch.Stop;
}
Macro {area="Editor"; key=S.KeyNextWord; priority=S.PriorNextWord; description=M.DescrNextWord;
action=SimSU.Editor_QuickSearch.NextWord;
}
Macro {area="Editor"; key=S.KeyPrevWord; priority=S.PriorPrevWord; description=M.DescrPrevWord;
action=SimSU.Editor_QuickSearch.PrevWord;
}