Show-FarMessage 'Registered, use F11 \ FarNet \ Drawers \ Cyrillic'
Re: Редактор: как выделить цветом неск-ко слов
Posted: Sun 11 May, 2014 14:12
by AleXH
zg, спасибо, сам бы такой скрипт не одолел. Может у вас ещё есть и вариант с подсветкой всей кириллицы в тексте, независимо от латиницы? - Чтобы "национальность" отдельно стоящих букв ACEHTOPKXBM можно было увидеть по шоркату.
Re: Colorer: как выделить неск-ко слов
Posted: Sun 11 May, 2014 15:48
by John Doe
zg wrote:как-то так.
17 скачиваний, и только у меня одного не работает?
Функция ProcessCrest не определена.
Видимо надо исправить на ProcessColors.
Re: Редактор: как выделить цветом неск-ко слов
Posted: Sun 11 May, 2014 16:12
by John Doe
AleXH wrote:zg, спасибо, сам бы такой скрипт не одолел. Может у вас ещё есть и вариант с подсветкой всей кириллицы в тексте, независимо от латиницы? - Чтобы "национальность" отдельно стоящих букв ACEHTOPKXBM можно было увидеть по шоркату.
F=far.Flags
editors={}
rusHL=false
color=
Flags:bit64.bor F.FCF_FG_4BIT,F.FCF_BG_4BIT
ForegroundColor:0xe
BackgroundColor:0xc
colorguid=win.Uuid "1687B745-233F-4c33-AA46-3A39E67B0170"
word=regex.new "/(\\i+)/"
rus=
match:regex.new "/([а-яёА-ЯЁ]+)/"
find:regex.new "/([а-яёА-ЯЁ]+)/"
GetEditorData=(id)->
data=editors[id]
if not data
editors[id]=
start:0
finish:0
data=editors[id]
data
RemoveColors=(id,data)->
for ii=data.start,data.finish
editor.DelColor id,ii,0,colorguid
ProcessColors=(id,update)->
data=GetEditorData id
RemoveColors id,data
update data
Macro
description:"On/Off подсветки кириллицы"
area:"Editor"
key:"F3"
action:->
rusHL=not rusHL
Event
group:"EditorEvent"
action:(id,event,param)->
if event==F.EE_READ
editors[id]=
start:0
finish:0
if event==F.EE_CLOSE
editors[id]=nil
if event==F.EE_REDRAW then
ei=editor.GetInfo!
ProcessColors ei.EditorID,(data)->
data.start=ei.TopScreenLine
data.finish=math.min ei.TopScreenLine+ei.WindowSizeY,ei.TotalLines
for ii=data.start,data.finish
line=editor.GetString(-1,ii).StringText
posl=1
while true
lbegin,lend,curr=word\find line,posl
if lbegin==nil then break
if rusHL and rus.match\match(curr)
posw=1
while true
wbegin,wend=rus.find\find curr,posw
if not wbegin then break
editor.AddColor ei.EditorID,ii,lbegin+wbegin-1,lbegin+wend-1,0,color,190,colorguid
posw=wend+1
posl=lend+1
Event
group:"ExitFAR"
action:->
wincount=far.AdvControl F.ACTL_GETWINDOWCOUNT,0,0
for ii=1,wincount
info=far.AdvControl F.ACTL_GETWINDOWINFO,ii,0
if info and F.WTYPE_EDITOR==info.Type
ProcessColors info.Id,(data)->
data.start=0
data.finish=0
Модификация скрипта zg - включение/отключение подсветки всех кириллических символов в редакторе по F3. Скрипт работает, вместе с тем он не оптимален, так как перерисовывает экран и при отключенной подсветке.
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 13:53
by John Doe
Почему же не сделано оптимально?
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 13:56
by AleXH
John Doe, знаний не хватает Но zg огромное спасибо - очень удобно. Возможно имело бы смысл раскрашивать не во всех окнах редактора, а только в инициированном, но победить не смогу.
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 13:58
by John Doe
А какие тут знания нужны? Достаточно условие поставить в обработчике.
Вот кстати мой вариант, я по совпадению тоже баловался:
F=far.Flags
editors={}
color=
Flags:bit64.bor F.FCF_FG_4BIT,F.FCF_BG_4BIT
ForegroundColor:0x1
BackgroundColor:0xe
colorguid=win.Uuid "1687B745-233F-4c33-AA46-3A39E67B0170"
word=regex.new "/\\b(\\i+)\\b/"
rus=
match:regex.new "/[а-яёА-ЯЁ]*([a-zA-Z]+[а-яёА-ЯЁ]+)+[a-zA-Z]*/"
find:regex.new "/([а-яёА-ЯЁ]+)/"
GetEditorData=(id)->
data=editors[id]
if not data
editors[id]=
start:0
finish:0
data=editors[id]
data
RemoveColors=(id,data)->
for ii=data.start,data.finish
editor.DelColor id,ii,0,colorguid
ProcessColors=(id,update)->
data=GetEditorData id
RemoveColors id,data
update data
active=false
Event
group:"EditorEvent"
action:(id,event,param)->
if event==F.EE_READ
editors[id]=
start:0
finish:0
if event==F.EE_CLOSE
editors[id]=nil
if active and event==F.EE_REDRAW then
ei=editor.GetInfo!
ProcessColors ei.EditorID,(data)->
data.start=ei.TopScreenLine
data.finish=math.min ei.TopScreenLine+ei.WindowSizeY,ei.TotalLines
for ii=data.start,data.finish
line=editor.GetString(-1,ii).StringText
posl=1
while true
lbegin,lend,curr=word\find line,posl
if lbegin==nil then break
if rus.match\match(curr)
posw=1
while true
wbegin,wend=rus.find\find curr,posw
if not wbegin then break
editor.AddColor ei.EditorID,ii,lbegin+wbegin-1,lbegin+wend-1,0,color,190,colorguid
posw=wend+1
posl=lend+1
Event
group:"ExitFAR"
action:->
wincount=far.AdvControl F.ACTL_GETWINDOWCOUNT,0,0
for ii=1,wincount
info=far.AdvControl F.ACTL_GETWINDOWINFO,ii,0
if info and F.WTYPE_EDITOR==info.Type
ProcessColors info.Id,(data)->
data.start=0
data.finish=0
Macro
description:"Toggle"
area:"Editor"
key:"CtrlF1"
action:->
active = not active
if active
editor.Redraw()
else
ProcessColors editor.GetInfo(-1).EditorID,(data)->
data.start=1
data.finish=1
Насколько я помню, всё что потребовалось, это ввести переменную active, и добавить её в условие в обработчике: if active and event==F.EE_REDRAW then.
Плюс макрос на CtrlF1
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 14:11
by AleXH
Спасибо, не хватило здоровья уже дожать. Я подсвечиваю абсолютно все кириллические символы в тексте. Вот думаю, оптимальны ли такие регэкспы?:
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 14:14
by John Doe
Для вашего случая можно упростить логику (достаточно одного регэкспа).
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 14:30
by John Doe
AleXH wrote:Возможно имело бы смысл раскрашивать не во всех окнах редактора, а только в инициированном, но победить не смогу.
Если менять минимально, то можно в обработчике EE_READ сбрасывать флаг.
Но в идеале чуть иначе: действие EE_READ перенести в макрос, а качестве флага использовать саму таблицу editors (+маленько оптимизировать):
F=far.Flags
editors={}
color=
Flags:bit64.bor F.FCF_FG_4BIT,F.FCF_BG_4BIT
ForegroundColor:0x1
BackgroundColor:0xe
colorguid=win.Uuid "1687B745-233F-4c33-AA46-3A39E67B0170"
word=regex.new "/\\b(\\i+)\\b/"
rus=
match:regex.new "/[а-яёА-ЯЁ]*([a-zA-Z]+[а-яёА-ЯЁ]+)+[a-zA-Z]*/"
find:regex.new "/([а-яёА-ЯЁ]+)/"
GetEditorData=(id)->
data=editors[id]
if not data
editors[id]=
start:0
finish:0
data=editors[id]
data
RemoveColors=(id,data)->
for ii=data.start,data.finish
editor.DelColor id,ii,0,colorguid
ProcessColors=(id,update)->
data=GetEditorData id
RemoveColors id,data
update data
Event
group:"EditorEvent"
condition:(id,event,param)->
return editors[id]
action:(id,event,param)->
if event==F.EE_CLOSE
editors[id]=nil
if event==F.EE_REDRAW then
ei=editor.GetInfo!
ProcessColors ei.EditorID,(data)->
data.start=ei.TopScreenLine
data.finish=math.min ei.TopScreenLine+ei.WindowSizeY,ei.TotalLines
for ii=data.start,data.finish
line=editor.GetString(-1,ii).StringText
posl=1
while true
lbegin,lend,curr=word\find line,posl
if lbegin==nil then break
if rus.match\match(curr)
posw=1
while true
wbegin,wend=rus.find\find curr,posw
if not wbegin then break
editor.AddColor ei.EditorID,ii,lbegin+wbegin-1,lbegin+wend-1,0,color,190,colorguid
posw=wend+1
posl=lend+1
Event
group:"ExitFAR"
action:->
wincount=far.AdvControl F.ACTL_GETWINDOWCOUNT,0,0
for ii=1,wincount
info=far.AdvControl F.ACTL_GETWINDOWINFO,ii,0
if info and F.WTYPE_EDITOR==info.Type
ProcessColors info.Id,(data)->
data.start=0
data.finish=0
Macro
description:"Toggle"
area:"Editor"
key:"CtrlF1"
action:->
id = editor.GetInfo(-1).EditorID
if not editors[id]
editors[id] =
start:0
finish:0
editor.Redraw()
else
ProcessColors id,(data)->
data.start=1
data.finish=1
editors[id] = nil
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Wed 21 May, 2014 14:39
by AleXH
Кстати, регэсп не матчит случаи с лидирующей кириллицей, типа йййqqqq.
Универсальный вариант. Подсветка всей кириллицы, либо только смешанной с латиницей.
rus_all=true
F=far.Flags
editors={}
color=
Flags:bit64.bor F.FCF_FG_4BIT,F.FCF_BG_4BIT
ForegroundColor:0xe
BackgroundColor:0xc
colorguid=win.Uuid "1687B745-233F-4c33-AA46-3A39E67B0170"
word={}
rus={}
if rus_all
word=regex.new "/(\\i+)/"
rus=
match:regex.new "/([а-яёА-ЯЁ]+)/"
find:regex.new "/([а-яёА-ЯЁ]+)/"
else
word=regex.new "/\\b(\\i+)\\b/"
rus=
match:regex.new "/[а-яёА-ЯЁ]*([a-zA-Z]+[а-яёА-ЯЁ]+)+[a-zA-Z]*/"
find:regex.new "/([а-яёА-ЯЁ]+)/"
GetEditorData=(id)->
data=editors[id]
if not data
editors[id]=
start:0
finish:0
data=editors[id]
data
RemoveColors=(id,data)->
for ii=data.start,data.finish
editor.DelColor id,ii,0,colorguid
ProcessColors=(id,update)->
data=GetEditorData id
RemoveColors id,data
update data
Event
group:"EditorEvent"
condition:(id,event,param)->
return editors[id]
action:(id,event,param)->
if event==F.EE_CLOSE
editors[id]=nil
if event==F.EE_REDRAW then
ei=editor.GetInfo!
ProcessColors ei.EditorID,(data)->
data.start=ei.TopScreenLine
data.finish=math.min ei.TopScreenLine+ei.WindowSizeY,ei.TotalLines
for ii=data.start,data.finish
line=editor.GetString(-1,ii).StringText
posl=1
while true
lbegin,lend,curr=word\find line,posl
if lbegin==nil then break
if rus.match\match(curr)
posw=1
while true
wbegin,wend=rus.find\find curr,posw
if not wbegin then break
editor.AddColor ei.EditorID,ii,lbegin+wbegin-1,lbegin+wend-1,0,color,190,colorguid
posw=wend+1
posl=lend+1
Event
group:"ExitFAR"
action:->
wincount=far.AdvControl F.ACTL_GETWINDOWCOUNT,0,0
for ii=1,wincount
info=far.AdvControl F.ACTL_GETWINDOWINFO,ii,0
if info and F.WTYPE_EDITOR==info.Type
ProcessColors info.Id,(data)->
data.start=0
data.finish=0
Macro
description:"On/Off подсветки кириллицы"
area:"Editor"
key:"F3"
action:->
id = editor.GetInfo(-1).EditorID
if not editors[id]
editors[id] =
start:0
finish:0
editor.Redraw()
else
ProcessColors id,(data)->
data.start=1
data.finish=1
editors[id] = nil
Re: [MoonScript] Подсветить в смешанном тексте всю кириллицу
Posted: Tue 03 Jun, 2014 06:25
by AleXH
В редакторе открыт файл в одну строку 128К символов, кодовая страница 65001 (utf8), текущий вариант красит её 44сек, но если получать и обрабатывать строку в utf-16LE,
for ii=data.start,data.finish
line=editor.GetStringW(-1,ii).StringText
posl=1
while true
lbegin,lend,curr=word\findW line,posl
if lbegin==nil then break
if rus.match\matchW curr
posw=1
while true
wbegin,wend=rus.find\findW curr,posw
if not wbegin then break
editor.AddColor ei.EditorID,ii,lbegin+wbegin-1,lbegin+wend-1,0,color,190,colorguid
posw=wend+1
posl=lend+1
, то время раскраски составит менее секунды. Что-то в фаре не так, иначе откуда такая катастрофическая разница?