Отображение и запоминание вертикальной границы в редакторе, кодовой страницы и цветовой схемы

Здесь выкладываются готовые к использованию макросы и скрипты.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Отображение и запоминание вертикальной границы в редакторе, кодовой страницы и цветовой схемы

Post by IgorZ »

Данный скрипт выполняет три функции:
  1. Отрисовывает вертикальную линию в редакторе в указанной колонке (предполагается, что так будет отмечаться правая граница текста, но возможно использование в любых вообразимых целях). Линия может быть перемещена влево-вправо клавишами AltShiftLeft / AltShiftRight и возвращена на исходную позицию AltShiftHome. Позиция линии запоминается для каждого открытого файла до перезагрузки макросов.
  2. Для каждого впервые открытого файла устанавливается кодовая страница.
  3. Для каждого открытого файла запоминается цветовая схема плагина FarColorer. Хранится до перезагрузки макросов.
Позицию вертикальной линии, кодовую страницу и цветовую схему можно задавать по умолчанию для произвольной файловой маски в стиле Far (некоторые примеры есть в файле скрипта). Маски задаются таблицей и перебираются последовательно до нахождения первой подходящей. Для каждого параметра перебор делается независимо, поэтому позиция линии, цветовая схема и кодовая страница по умолчанию могут быть взяты от разных файловых масок.

Основой послужил скрипт авторства Shmuel. Исходная тема.




Attachments
vertical_line.1.5.0.7z
(4.05 KiB) Downloaded 132 times
Last edited by IgorZ on Mon 22 Nov, 2021 09:18, edited 2 times in total.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

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

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

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

Спасибо!
Visualizer+[ESC]
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Можно скриптом. Если не нужно оперативно перемещать линию границы клавишами, то макрос внизу следует удалить или закомментировать.
brigadir
Posts: 2
Joined: Sat 16 Jul, 2016 15:15
Has thanked: 4 times

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

Post by brigadir »

@Shmuel Огромное спасибо! Легко и просто! То что надо! Спасибо!
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

brigadir
Скрипт поправлен (неправильно обрабатывались строки, содержащие табы).
brigadir
Posts: 2
Joined: Sat 16 Jul, 2016 15:15
Has thanked: 4 times

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

Post by brigadir »

@Shmuel Теперь всё работает! :-) Ещё раз большое спасибо за помощь!
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Понадобилось на ходу временно менять позицию правой границы. В результате слегка доработал данный скрипт. Теперь при перемещении границы в течение секунды (настраивается) после последнего нажатия клавиши перемещения границы в заголовке редактора выводится новая позиция. Также добавлено кнопкосочетание AltShiftHome для возврата на изначальную позицию.
  1. -- Settings
  2.  
  3. local FileMask = "*"
  4.  
  5. local Color = 0xF0
  6.  
  7. local Pos = 151
  8.  
  9. local Period = 1000
  10.  
  11. -- End of settings
  12.  
  13. local F = far.Flags
  14.  
  15. local colorFlags = F.ECF_TABMARKFIRST + F.ECF_TABMARKCURRENT + F.ECF_AUTODELETE
  16.  
  17. --
  18.  
  19. local StartPos,EdTitle,LastTime,Timer = Pos
  20.  
  21. --
  22.  
  23. local function OnTimer()
  24.  
  25. if Far.UpTime-LastTime>Period then Timer.Close(Timer) Editor.SetTitle(EdTitle) EdTitle = nil end
  26.  
  27. end
  28.  
  29. --
  30.  
  31. Event {
  32.  
  33.   description="Add right border line";
  34.  
  35.   group="EditorEvent";
  36.  
  37.   filemask=FileMask;
  38.  
  39.   action=function(EditorId, Event)
  40.  
  41.     if Event==F.EE_REDRAW then
  42.  
  43.       local Info = editor.GetInfo(EditorId)
  44.  
  45.       local l1 = Info.TopScreenLine
  46.  
  47.       local l2 = math.min(l1+Info.WindowSizeY-1, Info.TotalLines)
  48.  
  49.       for line=l1,l2 do
  50.  
  51.         local p = editor.TabToReal(EditorId,line,Pos)
  52.  
  53.         editor.AddColor(EditorId,line,p,p,colorFlags,Color,100)
  54.  
  55.       end
  56.  
  57.     end
  58.  
  59.   end
  60.  
  61. }
  62.  
  63. --
  64.  
  65. Event{
  66.  
  67.   group="ExitFAR"; description="Close timer at exit"; condition=function() return Timer end;
  68.  
  69.   action=function() Timer.Close(Timer) mf.waitkey(Period+1) end;
  70.  
  71. }
  72.  
  73. --
  74.  
  75. Macro {
  76.  
  77.   description="Move border line";
  78.  
  79.   area="Editor"; key="AltShiftLeft AltShiftRight AltShiftHome";
  80.  
  81.   filemask=FileMask;
  82.  
  83.   action=function()
  84.  
  85.     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
  86.  
  87.     if not EdTitle then EdTitle = editor.GetTitle() Timer = far.Timer(Period,OnTimer) end
  88.  
  89.     Editor.SetTitle("VLine at : "..Pos.."   ") LastTime = Far.UpTime
  90.  
  91.   end;
  92.  
  93. }
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

Ещё раз доработал скрипт. Два изменения:
  1. Позиция линии запоминается для каждого файла отдельно. При перезагрузке макросов информация сбрасывается.
  2. Теперь можно задавать для разных масок файлов свои начальные позиции для линии. К примеру, в выложенном варианте для файлов с расширениями .sql и .pc линия по умолчанию будет в 81-й позиции, а для остальных - в 151-й. Маски перебираются по очереди, как записаны в файле, до первой подходящей.
  1. -- Settings
  2.  
  3. local Masks = { -- пары вида {<маска имени файла в стиле Far>,<позиция линии по умолчанию>}
  4.  
  5.   {"*.pc,*.sql",81},
  6.  
  7.   {"*",151}, -- Must be last! Должна быть последней!
  8.  
  9. }
  10.  
  11. local Color = 0xF0 -- цвет линии
  12.  
  13. local Period = 1000 -- длительность отображения в заголовке текущей позиции линии в миллисекундах
  14.  
  15. -- End of settings
  16.  
  17. local F = far.Flags
  18.  
  19. local colorFlags = F.ECF_TABMARKFIRST + F.ECF_TABMARKCURRENT + F.ECF_AUTODELETE
  20.  
  21. -- позиции для каждого файла, "родной" заголовок, последнее время нажатия клавиши, таймер, признак его остановки
  22.  
  23. local Files,EdTitle,LastTime,Timer,stop_timer = {}
  24.  
  25. --
  26.  
  27. local function GetDef(fn) -- получить для файла позицию линии по умолчанию
  28.  
  29. for _,m in pairs(Masks) do if mf.fmatch(fn,m[1])==1 then Files[fn] = m[2] break end end
  30.  
  31. return Files[fn]
  32.  
  33. end
  34.  
  35. --
  36.  
  37. local function WriteLine(EditorId) -- нарисовать вертикальную линию
  38.  
  39. local Info = editor.GetInfo(EditorId)
  40.  
  41. local fn = Info.FileName:match("[^\\]+$")
  42.  
  43. if not Files[fn] then GetDef(fn) end
  44.  
  45. local l1 = Info.TopScreenLine
  46.  
  47. local l2 = math.min(l1+Info.WindowSizeY-1, Info.TotalLines)
  48.  
  49. for line=l1,l2 do
  50.  
  51.   local p = editor.TabToReal(EditorId,line,Files[fn])
  52.  
  53.   editor.AddColor(EditorId,line,p,p,colorFlags,Color,100)
  54.  
  55. end
  56.  
  57. end
  58.  
  59. --
  60.  
  61. local function OnTimer() -- по выходу из Far или превышению периода восстановить заголовок и убрать таймер
  62.  
  63. if stop_timer or Far.UpTime-LastTime>Period then
  64.  
  65.   Timer:Close() Editor.SetTitle(EdTitle) EdTitle = nil
  66.  
  67. end
  68.  
  69. end
  70.  
  71. --
  72.  
  73. local function OnKey() -- по нажатию клавиши пересчитать позицию линии и вывести в заголовке
  74.  
  75. local fn,k = editor.GetFileName():match("[^\\]+$"),akey(1):sub(9)
  76.  
  77. Files[fn] = k=="Left" and math.max(1,Files[fn]-1) or k=="Right" and Files[fn]+1 or GetDef(fn)
  78.  
  79. if not EdTitle then EdTitle = editor.GetTitle() Timer = far.Timer(Period,OnTimer) end
  80.  
  81. Editor.SetTitle("VLine at : "..Files[fn].."   ") LastTime = Far.UpTime
  82.  
  83. end
  84.  
  85. --
  86.  
  87. Event { -- отрисовка линии по событию
  88.  
  89.   description="Add right border line"; group="EditorEvent";
  90.  
  91.   condition=function(_,Event) return Event==F.EE_REDRAW end; action=WriteLine;
  92.  
  93. }
  94.  
  95. --
  96.  
  97. Event{ -- скажем таймеру закрыться, если закрывается Far
  98.  
  99.   group="ExitFAR"; description="Close timer at exit"; action=function() stop_timer = true end;
  100.  
  101. }
  102.  
  103. --
  104.  
  105. Macro { -- передвинуть линию влево/вправо/на исходную позицию
  106.  
  107.   description="Move border line"; area="Editor";
  108.  
  109.   key="AltShiftLeft AltShiftRight AltShiftHome"; action=OnKey;
  110.  
  111. }
Attachments
vertical_line.1.2.1.lua
(2.87 KiB) Downloaded 221 times
User avatar
AlexL
Posts: 14
Joined: Mon 28 May, 2007 21:14
Location: Израиль
Has thanked: 2 times
Contact:

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

Post by AlexL »

Скачал, положил в "Addons\Macros\scripts\", а при открытии C-файла вертикальной полосы нет. Даже в FAR 5820 (в котором Visualizer и CCAssistant еще работали). Где я ошибся?
Last edited by AlexL on Sat 26 Jun, 2021 00:27, edited 1 time in total.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

 ! Message from: HaRT
AlexL wrote: Sat 26 Jun, 2021 00:26 положил в "Addons\Macros\scripts\"
Неправильно. Идите читать Far FAQ (ссылка вверху страницы). И за нарушение правил форума бан на неделю.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

@IgorZ
Оформите шапку?
https://t.me/FarManager — Telegram чат
User avatar
AlexL
Posts: 14
Joined: Mon 28 May, 2007 21:14
Location: Израиль
Has thanked: 2 times
Contact:

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

Post by AlexL »

Предлагаю так:


(Три новых строки выделены цветом.)
Менять переменную "MoveableMargin" легче, чем комментировать всё макро. Да и текстовое объяснение не помешает.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Отображение и запоминание вертикальной границы в редакторе, кодовой страницы и цветовой схемы

Post by IgorZ »

John Doe wrote: Tue 06 Jul, 2021 08:50 @IgorZ
Оформите шапку?
Сделал. Заодно причесал все наработки и выложил свежую версию.

Версия 1.4.0 -
  • Много доработок по сравнению с последней выложенной, подробности в истории версий в заглавном посте темы.
AlexL wrote:Предлагаю так ... Может мешать выделению вертикальных блоков.
Кроме AltShiftСтрелки для выделения вертикальных блоков можно использовать AltCtrlСтрелки и просто AltСтрелки, так что не вижу необходимости в данной модификации. Кроме того, замечательный модуль rebind авторства JohnDoe позволяет переназначать клавици макросам и даже вообще отключать их, совсем не вмешиваясь в исходный код. Рекомендую. Для большего удобства пользования rebind можете использовать мой LuaManager (да, это самореклама ;) ).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Отображение и запоминание вертикальной границы в редакторе, кодовой страницы и цветовой схемы

Post by John Doe »

IgorZ wrote: Sat 16 Jul, 2016 15:26 Для каждого открытого файла запоминается кодовая страница.
А разве фар сам не запоминает?
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Отображение и запоминание вертикальной границы в редакторе, кодовой страницы и цветовой схемы

Post by buniak_a_h »

John Doe wrote: Fri 09 Jul, 2021 07:25 А разве фар сам не запоминает?
1. Вроде, запоминает …
2. На самом деле полезность скрипта сильно ослабляется (даже обнуляется) фразой "до перезагрузки макросов". Но запоминать в базе такие параметры для каждого файла очень накладно. Логично было бы привязать к расширению (к маске). Ну и запоминать в db (с предоставлением сервиса по удалению и, возможно, редактированию запомненного).
Post Reply

Return to “Полезные макросы и скрипты”