[MoonScript] Подсветка кириллицы и пробельных символов

Здесь обсуждается всё, что касается макросов.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

[MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

Image

Исходный код: https://forum.ru-board.com/topic.cgi?fo ... it=1&m=1#1

Назначение - подсветить кириллицу и изменить цвет , отображаемых FAR. Для комфортного редактирования текста, пробельные символы раскрашиваются не голубым, а светло-синим на синем - так они не сливаются с текстом. Кириллица раскрашивается максимально заметно - жёлтым по красному.

:!: Улучшения (ваши) в коде скрипта принимаются и даже приветствуются.

Код скрипта раскрашивает только текст, отображённый в окне редактора, поэтому скрипт не "зависает" на длинных строках. Вызывается скрипт в окне редактора по нажатию функциональной клавиши F3. Для более детальной информации смотрите код скрипта.

Скрипт-прототип
Last edited by John Doe on Sun 10 Nov, 2019 12:06, edited 1 time in total.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

Latest post of the previous page:

Гуид поменяйте
Поменял, описание исправил.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

zg wrote:фар отдаёт ссылку на внутренние данные, колорер работает с ними, луафар — копирует себе. в принципе было бы логично расширить.
получить подстроку из редактора без копирования всей строки:
  1. local ffi=require("ffi")
  2.  
  3. local function GetSubStringW(EditorId,StringNumber,Start,Length)
  4.  
  5.   local ec=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).EditorControl
  6.  
  7.   local egs=ffi.new("struct EditorGetString")
  8.  
  9.   egs.StructSize=ffi.sizeof(egs)
  10.  
  11.   egs.StringNumber=StringNumber-1
  12.  
  13.   if ec(EditorId,"ECTL_GETSTRING",0,egs)~=0 and Start<=egs.StringLength then
  14.  
  15.     Length=math.min(Length,egs.StringLength-Start+1)
  16.  
  17.     return ffi.string(egs.StringText+Start-1,Length*2)
  18.  
  19.   end
  20.  
  21. end
  22.  
  23.  
  24.  
  25. local function GetSubString(EditorId,StringNumber,Start,Length)
  26.  
  27.   local str=GetSubStringW(EditorId,StringNumber,Start,Length)
  28.  
  29.   return str and win.Utf16ToUtf8(str)
  30.  
  31. end
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by Shmuel »

"ECTL_GETSTRING" с FFI не прокатит. Нужно целое число, а не строковый литерал.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

Shmuel wrote:"ECTL_GETSTRING" с FFI не прокатит. Нужно целое число, а не строковый литерал.
код — рабочий.
Image
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by Shmuel »

О, спасибо, не знал (век живи, век учись).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by John Doe »

Shmuel wrote:"ECTL_GETSTRING" с FFI не прокатит. Нужно целое число, а не строковый литерал.
Я так понимаю, что оптимальнее всего ffi.C.ECTL_GETSTRING
zg wrote:получить подстроку из редактора без копирования всей строки:
[...]
Интересно теперь сравнить производительность.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

GetSubStringW() возвращает nil на пустых строках, исправил на
  1. ffi=require "ffi"
  2.  
  3.  
  4.  
  5. GetSubStringW=(EditorId,StringNumber,Start,Length)->
  6.  
  7.   ec=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo!).EditorControl
  8.  
  9.   egs=ffi.new "struct EditorGetString"
  10.  
  11.   egs.StructSize=ffi.sizeof egs
  12.  
  13.   egs.StringNumber=StringNumber-1
  14.  
  15.   if ec(EditorId-1,"ECTL_GETSTRING",0,egs)~=0 and Start<=egs.StringLength
  16.  
  17.     Length=math.min Length,egs.StringLength-Start+1
  18.  
  19.     return ffi.string egs.StringText+Start-1,Length*2
  20.  
  21.   else
  22.  
  23.     return ""
Код скрипта полностью На коротких строках работает, но не во всех файлах - почему, пока не понял.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

EditorId-1 => EditorId.
также есть проблемы с табами, надо как-то так:

Code: Select all

RealLeft=editor.TabToReal ei.EditorID,ii,ei.LeftPos
и везде использовать RealLeft вместо ei.LeftPos. может привести к деградации производительности.
по хорошему ширину надо тоже конвертировать, но так как она может только уменьшится, то реально быстрее забить.
так же вызов два раза editor.GetStringW сводит на нет всю оптимизацию. StringLength можно вернуть из GetSubStringW вторым параметром.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

Не понимаю почему, но код не работает. Получаю значения
  1. line,ll=GetSubStringW ei.EditorID,ii,ei.LeftPos,ei.WindowSizeX
В результате ll=0
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

AleXH wrote:не работает.
вы присваиваете fLength значение egs.StringLength до того, как оно будет заполнено фаром.
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

Понял. Изменение производительности оценивал так: создал файл из 30 строк по 11М символов. Включал раскраску, после отработки нажимал на курсор вправо и смотрел сколько символов он успеет пройти за 20 сек. Предыдущий вариант проползал 24 символа, новый 31. При наличии табуляций в тексте артефактов в раскраске не наблюдаю.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

AleXH wrote:Изменение производительности оценивал так: создал файл из 30 строк по 11М символов. Включал раскраску, после отработки нажимал на курсор вправо и смотрел сколько символов он успеет пройти за 20 сек. Предыдущий вариант проползал 24 символа, новый 31.
как-то мало. я вот так пробовал:
  1. local start=Far.UpTime
  2.  
  3. for ii=1,10000 do
  4.  
  5.   editor.GetStringW(-1,1)
  6.  
  7. end
  8.  
  9. far.Show(Far.UpTime-start)
GetStringW: ~40000, GetSubStringW(...,1,200): ~30.
AleXH wrote:При наличии табуляций в тексте артефактов в раскраске не наблюдаю.
всего в начале строки 6 табов:
Image
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

FAR3.0.3924x32 красит по коду из моего предыдущего сообщения абсолютно правильно независимо от сочетаний пробельных и обычных символов, их количества и последовательностей.

Ваш тест преобразованный к виду:
  1. Macro
  2.  
  3.   description:"Test"
  4.  
  5.   area:"Editor"
  6.  
  7.   key:"F3"
  8.  
  9.   action:->
  10.  
  11.     start=Far.UpTime
  12.  
  13.     for ii=1,10000
  14.  
  15.       editor.GetStringW(-1,1)
  16.  
  17.  
  18.  
  19.     far.Show(Far.UpTime-start)
На строке в 11M выдаёт - 75437.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

AleXH wrote:FAR3.0.3924x32 красит по коду из моего предыдущего сообщения абсолютно правильно независимо от сочетаний пробельных и обычных символов, их количества и последовательностей.
это неправда. файл в аттаче. фар 80x25. открываете, жмёте энд, включаете свою раскраску, делаете скриншот и выкладываете здесь.
AleXH wrote:На строке в 11M выдаёт - 75437.
и что?
Attachments
test.7z
(122 Bytes) Downloaded 95 times
AleXH
Posts: 1000
Joined: Sun 12 Apr, 2009 05:21
Been thanked: 1 time

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by AleXH »

Проверил. Сходу красит правильно, но если курсор подогнать к правой границе экрана и нажать 2 раза вправо, то раскраска с самого левого таба начинает "съезжать". Нажимая вправо далее, табы слева на право теряют раскраску.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: [MoonScript] Подсветка кириллицы и пробельных символов

Post by zg »

AleXH wrote:Проверил. Сходу красит правильно, но если курсор подогнать к правой границе экрана и нажать 2 раза вправо, то раскраска с самого левого таба начинает "съезжать". Нажимая вправо далее, табы слева на право теряют раскраску.
да ладно? а как же:
AleXH wrote:При наличии табуляций в тексте артефактов в раскраске не наблюдаю.
AleXH wrote:FAR3.0.3924x32 красит по коду из моего предыдущего сообщения абсолютно правильно независимо от сочетаний пробельных и обычных символов, их количества и последовательностей.
Locked

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