-- Settings
local Masks = { -- пары вида {<маска имени файла в стиле Far>,<позиция линии по умолчанию>}
{"*.pc,*.sql",81},
{"*",151}, -- Must be last! Должна быть последней!
}
local Color = 0xF0 -- цвет линии
local Period = 1000 -- длительность отображения в заголовке текущей позиции линии в миллисекундах
-- End of settings
local F = far.Flags
local colorFlags = F.ECF_TABMARKFIRST + F.ECF_TABMARKCURRENT + F.ECF_AUTODELETE
-- позиции для каждого файла, "родной" заголовок, последнее время нажатия клавиши, таймер, признак его остановки
local Files,EdTitle,LastTime,Timer,stop_timer = {}
--
local function GetDef(fn) -- получить для файла позицию линии по умолчанию
for _,m in pairs(Masks) do if mf.fmatch(fn,m[1])==1 then Files[fn] = m[2] break end end
return Files[fn]
end
--
local function WriteLine(EditorId) -- нарисовать вертикальную линию
local Info = editor.GetInfo(EditorId)
local fn = Info.FileName:match("[^\\]+$")
if not Files[fn] then GetDef(fn) end
local l1 = Info.TopScreenLine
local l2 = math.min(l1+Info.WindowSizeY-1, Info.TotalLines)
for line=l1,l2 do
local p = editor.TabToReal(EditorId,line,Files[fn])
editor.AddColor(EditorId,line,p,p,colorFlags,Color,100)
end
end
--
local function OnTimer() -- по выходу из Far или превышению периода восстановить заголовок и убрать таймер
if stop_timer or Far.UpTime-LastTime>Period then
Timer:Close() Editor.SetTitle(EdTitle) EdTitle = nil
end
end
--
local function OnKey() -- по нажатию клавиши пересчитать позицию линии и вывести в заголовке
local fn,k = editor.GetFileName():match("[^\\]+$"),akey(1):sub(9)
Files[fn] = k=="Left" and math.max(1,Files[fn]-1) or k=="Right" and Files[fn]+1 or GetDef(fn)
if not EdTitle then EdTitle = editor.GetTitle() Timer = far.Timer(Period,OnTimer) end
Editor.SetTitle("VLine at : "..Files[fn].." ") LastTime = Far.UpTime
end
--
Event { -- отрисовка линии по событию
description="Add right border line"; group="EditorEvent";
condition=function(_,Event) return Event==F.EE_REDRAW end; action=WriteLine;
}
--
Event{ -- скажем таймеру закрыться, если закрывается Far
group="ExitFAR"; description="Close timer at exit"; action=function() stop_timer = true end;
}
--
Macro { -- передвинуть линию влево/вправо/на исходную позицию
description="Move border line"; area="Editor";
key="AltShiftLeft AltShiftRight AltShiftHome"; action=OnKey;
}