Отображение правой фиксированной границы в редакторе

Здесь обсуждается всё, что касается макросов.
Post Reply
brigadir
Posts: 3
Joined: Sat 16 Jul, 2016 15:15
Has thanked: 4 times

Отображение правой фиксированной границы в редакторе

Post by brigadir » Sat 16 Jul, 2016 15:26

Используется Far Manager 3.0.

Вопрос следующий: есть ли возможность во внутреннем редакторе показать правую фиксированную границу (скажем, 80 символов)? То есть нужна вертикальная линия определённого цвета, отличного от цвета основного фона, шириной в один символ, расположенная в определённой колонке.

Покопался в документации к Far Colorer... ничего похожего не нашёл. Возможно плохо искал.

Спасибо!

User avatar
HaRT
Moderator
Posts: 8469
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 74 times
Been thanked: 135 times

Отображение правой фиксированной границы в редакторе

Post by HaRT » Sat 16 Jul, 2016 15:58

Фар есть инструмент, а не нянька. © 2009 DrKnS

Shmuel
Posts: 5523
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

Отображение правой фиксированной границы в редакторе

Post by Shmuel » Sat 16 Jul, 2016 17:28

Можно скриптом. Если не нужно оперативно перемещать линию границы клавишами, то макрос внизу следует удалить или закомментировать.

brigadir
Posts: 3
Joined: Sat 16 Jul, 2016 15:15
Has thanked: 4 times

Отображение правой фиксированной границы в редакторе

Post by brigadir » Sat 16 Jul, 2016 17:48

@Shmuel Огромное спасибо! Легко и просто! То что надо! Спасибо!

Shmuel
Posts: 5523
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

Отображение правой фиксированной границы в редакторе

Post by Shmuel » Sat 16 Jul, 2016 18:03

brigadir
Скрипт поправлен (неправильно обрабатывались строки, содержащие табы).

brigadir
Posts: 3
Joined: Sat 16 Jul, 2016 15:15
Has thanked: 4 times

Отображение правой фиксированной границы в редакторе

Post by brigadir » Sat 16 Jul, 2016 18:13

@Shmuel Теперь всё работает! :-) Ещё раз большое спасибо за помощь!

IgorZ
Posts: 532
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 22 times

Отображение правой фиксированной границы в редакторе

Post by IgorZ » Tue 18 Oct, 2016 06:02

Понадобилось на ходу временно менять позицию правой границы. В результате слегка доработал данный скрипт. Теперь при перемещении границы в течение секунды (настраивается) после последнего нажатия клавиши перемещения границы в заголовке редактора выводится новая позиция. Также добавлено кнопкосочетание AltShiftHome для возврата на изначальную позицию.
  1. -- Settings
  2. local FileMask = "*"
  3. local Color = 0xF0
  4. local Pos = 151
  5. local Period = 1000
  6. -- End of settings
  7. local F = far.Flags
  8. local colorFlags = F.ECF_TABMARKFIRST + F.ECF_TABMARKCURRENT + F.ECF_AUTODELETE
  9. --
  10. local StartPos,EdTitle,LastTime,Timer = Pos
  11. --
  12. local function OnTimer()
  13. if Far.UpTime-LastTime>Period then Timer.Close(Timer) Editor.SetTitle(EdTitle) EdTitle = nil end
  14. end
  15. --
  16. Event {
  17.   description="Add right border line";
  18.   group="EditorEvent";
  19.   filemask=FileMask;
  20.   action=function(EditorId, Event)
  21.     if Event==F.EE_REDRAW then
  22.       local Info = editor.GetInfo(EditorId)
  23.       local l1 = Info.TopScreenLine
  24.       local l2 = math.min(l1+Info.WindowSizeY-1, Info.TotalLines)
  25.       for line=l1,l2 do
  26.         local p = editor.TabToReal(EditorId,line,Pos)
  27.         editor.AddColor(EditorId,line,p,p,colorFlags,Color,100)
  28.       end
  29.     end
  30.   end
  31. }
  32. --
  33. Event{
  34.   group="ExitFAR"; description="Close timer at exit"; condition=function() return Timer end;
  35.   action=function() Timer.Close(Timer) mf.waitkey(Period+1) end;
  36. }
  37. --
  38. Macro {
  39.   description="Move border line";
  40.   area="Editor"; key="AltShiftLeft AltShiftRight AltShiftHome";
  41.   filemask=FileMask;
  42.   action=function()
  43.     local k = akey(1):sub(9) if k=="Home" then Pos=StartPos elseif k=="Left" then Pos=math.max(1,Pos-1) else Pos=Pos+1 end
  44.     if not EdTitle then EdTitle = editor.GetTitle() Timer = far.Timer(Period,OnTimer) end
  45.     Editor.SetTitle("VLine at : "..Pos.."   ") LastTime = Far.UpTime
  46.   end;
  47. }

IgorZ
Posts: 532
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 22 times

Отображение правой фиксированной границы в редакторе

Post by IgorZ » Wed 08 Nov, 2017 07:46

Ещё раз доработал скрипт. Два изменения:
  1. Позиция линии запоминается для каждого файла отдельно. При перезагрузке макросов информация сбрасывается.
  2. Теперь можно задавать для разных масок файлов свои начальные позиции для линии. К примеру, в выложенном варианте для файлов с расширениями .sql и .pc линия по умолчанию будет в 81-й позиции, а для остальных - в 151-й. Маски перебираются по очереди, как записаны в файле, до первой подходящей.
  1. -- Settings
  2. local Masks = { -- пары вида {<маска имени файла в стиле Far>,<позиция линии по умолчанию>}
  3.   {"*.pc,*.sql",81},
  4.   {"*",151}, -- Must be last! Должна быть последней!
  5. }
  6. local Color = 0xF0 -- цвет линии
  7. local Period = 1000 -- длительность отображения в заголовке текущей позиции линии в миллисекундах
  8. -- End of settings
  9. local F = far.Flags
  10. local colorFlags = F.ECF_TABMARKFIRST + F.ECF_TABMARKCURRENT + F.ECF_AUTODELETE
  11. -- позиции для каждого файла, "родной" заголовок, последнее время нажатия клавиши, таймер, признак его остановки
  12. local Files,EdTitle,LastTime,Timer,stop_timer = {}
  13. --
  14. local function GetDef(fn) -- получить для файла позицию линии по умолчанию
  15. for _,m in pairs(Masks) do if mf.fmatch(fn,m[1])==1 then Files[fn] = m[2] break end end
  16. return Files[fn]
  17. end
  18. --
  19. local function WriteLine(EditorId) -- нарисовать вертикальную линию
  20. local Info = editor.GetInfo(EditorId)
  21. local fn = Info.FileName:match("[^\\]+$")
  22. if not Files[fn] then GetDef(fn) end
  23. local l1 = Info.TopScreenLine
  24. local l2 = math.min(l1+Info.WindowSizeY-1, Info.TotalLines)
  25. for line=l1,l2 do
  26.   local p = editor.TabToReal(EditorId,line,Files[fn])
  27.   editor.AddColor(EditorId,line,p,p,colorFlags,Color,100)
  28. end
  29. end
  30. --
  31. local function OnTimer() -- по выходу из Far или превышению периода восстановить заголовок и убрать таймер
  32. if stop_timer or Far.UpTime-LastTime>Period then
  33.   Timer:Close() Editor.SetTitle(EdTitle) EdTitle = nil
  34. end
  35. end
  36. --
  37. local function OnKey() -- по нажатию клавиши пересчитать позицию линии и вывести в заголовке
  38. local fn,k = editor.GetFileName():match("[^\\]+$"),akey(1):sub(9)
  39. Files[fn] = k=="Left" and math.max(1,Files[fn]-1) or k=="Right" and Files[fn]+1 or GetDef(fn)
  40. if not EdTitle then EdTitle = editor.GetTitle() Timer = far.Timer(Period,OnTimer) end
  41. Editor.SetTitle("VLine at : "..Files[fn].."   ") LastTime = Far.UpTime
  42. end
  43. --
  44. Event { -- отрисовка линии по событию
  45.   description="Add right border line"; group="EditorEvent";
  46.   condition=function(_,Event) return Event==F.EE_REDRAW end; action=WriteLine;
  47. }
  48. --
  49. Event{ -- скажем таймеру закрыться, если закрывается Far
  50.   group="ExitFAR"; description="Close timer at exit"; action=function() stop_timer = true end;
  51. }
  52. --
  53. Macro { -- передвинуть линию влево/вправо/на исходную позицию
  54.   description="Move border line"; area="Editor";
  55.   key="AltShiftLeft AltShiftRight AltShiftHome"; action=OnKey;
  56. }
Attachments
vertical_line.1.2.1.lua
(2.87 KiB) Downloaded 46 times

Post Reply

Return to “Обсуждение макросов”