При перемещении курсора и редактировании текста подсветка соответственно автоматически обновляется.
LCtrl+LAlt- фиксирует текущее слово.LCtrl+LAlt+Up/Down- навигация по вхождениям слова.
Code: Select all
-- https://forum.farmanager.com/viewtopic.php?t=13645
F = far.Flags
OPAQUE = 0xff000000
Flags = F.FCF_BG_INDEX +F.FCF_INHERIT_STYLE
color = :Flags, BackgroundColor:OPAQUE*0.2 + 0
color_locked = :Flags, BackgroundColor:OPAQUE*0.5 + 0
--SINGLE = F.FCF_FG_U_DATA0
--DOUBLE = F.FCF_FG_U_DATA1
--CURLY = F.FCF_FG_U_DATA0 +F.FCF_FG_U_DATA1
--DOTTED = F.FCF_FG_U_DATA2
--DASHED = F.FCF_FG_U_DATA0+F.FCF_FG_U_DATA2
--color_current =
-- Flags: DASHED +F.FCF_FG_UNDERLINE_INDEX +F.FCF_INHERIT_STYLE
-- UnderlineColor: OPAQUE + 14
--pattern = "[.:\\]?[%w_]+"
pattern = "[%w_]+"
pattern = "(()#{pattern}())"
getWord = (str,pos) ->
last = 0
while true
offset,last,match = str\find pattern, last+1
if not offset or offset>pos
break
elseif last>=pos
return match,offset,last
local hilite_once
colorGuid = win.Uuid"DD626AFB-4FC4-495B-8147-209770DB7DEC"
Word,Locked = {},{}
Event
description:"HiliteWord: auto-highlight current word occurrences"
group:"EditorEvent"
action:(id,event)->
switch event
when F.EE_CLOSE
Word[id] = nil
Locked[id] = nil
when F.EE_REDRAW
with editor.GetInfo id
unless Locked[id]
Word[id] = getWord (editor.GetString id,nil,3), .CurPos
if Word[id]
for line=.TopScreenLine, math.min .TopScreenLine+.WindowSizeY-1, .TotalLines
if text = editor.GetString id,line,3
last = 0
while last
offset,last,match = text\find pattern, last+1
if match==Word[id]
editor.AddColor id,line,offset,last, F.ECF_AUTODELETE,
Locked[id] and color_locked or color, 100, colorGuid
if hilite_once
with hilite_once
unless color_current
editor.Select(id, F.BTYPE_STREAM, .CurLine, .CurPos, .EndPos-.CurPos+1, 1)
else
editor.AddColor id, .CurLine, .CurPos, .EndPos, F.ECF_AUTODELETE, color_current, 101, colorGuid
hilite_once = nil
nil
Macro
description:"HiliteWord: lock current word"
area:"Editor"
key:"LCtrlLAlt"
id:"1EB3EB70-64E9-49F1-BB5D-CA875C4A97C6"
action: ->
with editor.GetInfo!
if Word[.EditorID]
Locked[.EditorID] = not Locked[.EditorID]
findNext = (word, CurLine, CurPos, to) ->
step = to==1 and -1 or 1
for line=CurLine,to,step
text = editor.GetString nil,line,3
local found
for w,pos,pos2 in text\gmatch pattern
if w==word
current = CurPos:pos,EndPos:pos2-1,CurLine:line
hilite_once = (step==1 or not hilite_once) and with current
.CurPos += 1 if word\match"^[.:\\]"
if line==CurLine
if step==1
continue if pos<=CurPos
else
continue if pos>=CurPos or pos2>CurPos
found = current
if step==1
break
if found
editor.SetPosition nil, found
with editor.GetInfo!
if .CurLine==.TopScreenLine and .TopScreenLine>1
found.TopScreenLine = math.max 1, .TopScreenLine - .WindowSizeY/2
editor.SetPosition nil, found
hilite_once = found
return
mf.beep! --nothing found
Macro
description:"HiliteWord: navigate to the prev/next word occurrence"
area:"Editor"
key:"LCtrlLAltUp LCtrlLAltDown"
id:"D734A9E4-E229-4013-BD63-A07D15CD4083"
action: ->
with editor.GetInfo!
if Word[.EditorID]
findNext Word[.EditorID], .CurLine, .CurPos, (mf.akey 1,1)\match"Up$" and 1 or .TotalLinesДля работы необходима настройка
InterfaceSettings / [x] Use VirtualTerminal for rendering.Или же можно
color перенастроить на более простой цвет.P.S.
Как лучше подсвечивать слово я пока для себя не решил.
В закомментированной строке коде
color настроен на подчёркивание (для этого требуется соответствующая поддержка терминалом).