Coder plugin (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Lenchik wrote:А что не работает при текущей записи букв в Delimiters?
Определенно я зря отказался от Git Extensions в пользу KDiff3 (т.к. изменения в конечном итоге достаточно компактны и вполне удобны для переноса строками при "синхронизации" с оригинальными версиями) :) Теперь проблема отследить то, что я делал и зачем.
Lenchik wrote:На гитхаб зальёте потом?
Нет аккуанта и не думаю, что кому-то интересно :) Из изменений - подсветка для mbox (файлы без расширений), кое-что вытащено из txt.coder сборок San_dr и Andrey_A_A (оригинальный txt.coder с незначительными изменениями переехал в "Text En/Ru detect" Call("Coder::Settings", 1, "textdetect"), задача которого выделить в тексте цифры и буквы En/Ru, в т.ч. показать, если строка набрана похожими буквами, но в другой раскладке), kixtart.coder и latex.coder не пользуются популярностью, mnu.coder для меню ТС (не выкладывал еще) тоже вряд-ли будет.

Переформулирую корректнее:
1. В сеции Delimiters обе записи

Code: Select all

1	0	${OP}	0	[
1	0	${OP}	0	"["
равнозначны?

2. Почему при

Code: Select all

...
Files:
...
*.txt
...

Quotes:
...
5	3	${STR}	0	`"`	`"`	""	""	""
...

Delimiters:
...
1	0	0	0	" "
1	0	0	0	"	"
1	0	${DEL2}	0	.
1	0	${DEL2}	0	,
1	0	${DEL2}	0	:
1	0	${DEL2}	0	;
1	0	${DEL2}	0	"
1	0	${DEL1}	0	(
1	0	${DEL1}	0	)
1	0	${DEL1}	0	$
1	0	${DEL1}	0	@
1	0	${DEL2}	0	&
1	0	${DEL2}	0	[
1	0	${DEL2}	0	]
1	0	${DEL2}	0	=
1	0	${DEL2}	0	*
1	0	${DEL2}	0	/
1	0	${DEL2}	0	-
1	0	${DEL2}	0	+
1	0	${DEL2}	0	>
1	0	${DEL2}	0	<

Words:
...
2	0	${IF}	0	"abcdefghijklmnopqrstuvwxyz"
...

(всё, что есть в любом coder-файле заменено на ...) есть такая проблема:

"x" explorer.exe
(explorer.exe)
"x"explorer.exe
?
Какой-то нюанс работы парсера с кавычками, который до меня не доходит.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Skif_off wrote:Какой-то нюанс работы парсера с кавычками, который до меня не доходит.
В таких ситуациях, на мой взгляд, хорошо работает метод "по аналогии".
Берем стандартный xml.coder. Находим в нем секцию Delimiters:

Code: Select all

Delimiters:
;======================================
;Flags  Font    Color   Color   Char(s)
;       style   text    bkgrnd
;======================================
1	0	0	0	" "
1	0	0	0	"	"
1	0	0	0	`"`
1	0	${DEL1}	0	</
1	0	${DEL1}	0	/>
1	0	${DEL1}	0	<
1	0	${DEL1}	0	>
1	0	${DEL2}	0	=
Обращаем внимание на первые три строки, и особенно на то, как в третьей оформлена двойная кавычка. Далее делаем у себя "по аналогии" (`"`).
Если все это проделать самостоятельно, то обычно в этот момент случается инсайт и вопросы снимаются.
Пробуйте.

P.S. Вы еще символ подчеркивания проигнорировали, фигурные скобки, "крышку" и еще чего-то.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

opk44 wrote:В таких ситуациях, на мой взгляд, хорошо работает метод "по аналогии".
Берем стандартный xml.coder...
Спасибо, не сообразил посмотреть другие coder-файлы :)
opk44 wrote:P.S. Вы еще символ подчеркивания проигнорировали, фигурные скобки, "крышку" и еще чего-то.
Из разделителей в настройках самого AkelPad? Это просто набросок, достаточный, чтобы воспроизвести ситуацию. Неразумная, однако, идея - перенести буквы в Words, ибо секция Delimiters неимоверно разрастется...

Получается, по первому вопросу все просто - нужно проверить и взять в кавычки только то, что нужно. Из разделителей в настройках самого AkelPad брать в кавычки нужно только кавычки :) Помимо пробела и табуляции.

З.Ы. Заранее прошу прощения, у меня бывает такое, зависаю и начинаю тупить на мелочи, бывает - очевидной мелочи. Самый простой выход - спросить (не смущает показаться глупым или невнимательным, понять важнее :))

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Подскажите, пожалуйста, по QuotesRE:

Code: Select all

0	"(?<!\\)%.*"	"\0=(3,${COMM},0)"
отлично работает, но только если перед % стоит любой разделитель из настроек AkelPad, если же стоит что-нибудь подсвеченное ранее, например, правилом

Code: Select all

0	"\\[a-z]+"	"\0=(0,${OP},0)"
то уже нет. Как можно сделать? Попробовать расширить предыдущие правила?

Правильно понимаю, что в текущей версии плагина в секции Folds при использовании Color text отличного от 0 можно исключить только конец блока (флаг 128), а начало нет?

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Тут думаю будет иместнее использовать "Quotes:"

Code: Select all

Quotes:
;Исключаем \%
1	0	0	0	"\%"	""	""	""	""
;Подсвечиваем %
1	3	${COMM}	0	"%"	""	""	""	""
Правильно понимаю...
Правильно.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Спасибо, работает, тут я поторопился и разнес:

Code: Select all

Quotes:
;513=1+512
513	3	${COMM}	0	"%"	""	""	""	""

QuotesRE:
0	"(?<!\\)%.*"	"\0=(3,${COMM},0)"
Если интересно: подсветка LaTeX (*.tex, *.aux, *.bbl, *.clo, *.cls, *.def, *.ltx, *.sty) и BibTeX (*.bib)
http://rghost.ru/51102737
К сожалению, с LaTeX не удалось добиться безусловно корректно работающего фолдинга, поэтому оставил только многострочные комментарии (пакет comment) и тело документа (т.к. преамбула за счет комментариев может быть длинной).
Last edited by Skif_off on Sat Dec 21, 2013 2:02 am, edited 3 times in total.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Из-за

Code: Select all

1	0	0	0	"\%"	""	""	""	""
всё, что будет после \% перестает подсвечиваться, это можно как-то избежать?

Добавлено:
Прогон, конечно же флагами: 17=1+16. Исправлено, ссылка в предыдущем посте тоже.

Добавлено2:
Исправлены опечатки, подсветка конца строки \\ (перенес из Delimiters в Quotes, иначе проблема с комментариями сразу за \\), фолдинг в latex.coder (выпилена строка с \com­ment ... \end­com­ment, т.к. иначе презабавнейше получается). Ссылка в посте выше обновлена.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Почему правило

Code: Select all

QuotesRE:
; Time - HH:MM:SS or HH:MM
0	"(?<!:)((([0-1][0-9]|[2][0-3])(:([0-5][0-9])){2})|(([0-1][0-9]|[2][0-3]):([0-5][0-9])))"	"\0=(0,${IF},0)"
не работает в начале строки?

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Skif_off

Code: Select all

0	"\b(([0-1][0-9])|([2][0-3]))(:([0-5][0-9])){1,2}"	"\0=(0,#00FF00,0)"
?

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Регулярка для JS регулярок:

Code: Select all

4 `(?![\w\)}\];.,]|^)\s*((/(?![\s\d/>*]).*([^\\]((\\\\)*)|([^\\](\\\\)*\\<))/)|(/\\\\/))([gim]{0,3})(?!\w)` `\1=(3,${TYPE},0)`
на моём наборе html-hta-wsf-js работает. Может, кто-нибудь раскритикует?

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Я думал у нас для обсуждения регулярок есть отдельная тема, но там я счастья не добился, так что попытаю его тут:
Помогите улучшить правило для coder.coder, которое должно раскрашивать правила в секции QuotesRE внутри .coder файлов:

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`\s*\\(\d*)=\((.*),(.*),(.*)\)\s*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
это правило в принципе работает:
Image
но если в правиле (для которого пишется это правило) BackRef'ов больше одного, то окрашивается не так, как хотелось бы:
Image
я понимаю почему так происходит (потому что шаблон составлен именно так, lol), но не понимаю как это исправить.
По идее, должно бы работать что-то вроде

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`(\s*\\(\d*)=\((.*),(.*),(.*)\)\s*)*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \4=(2,#0000ff,0) \5=(0,#ff0000,0) \6=(0,#00ff00,0) \7=(2,#0000ff,0)"
или

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`(?:\s*\\(\d*)=\((.*),(.*),(.*)\)\s*)*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
но одна из групп (.*) становится овержадной, а если им всем трём добавить по ? в конец - то правило перестаёт работать совсем.

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

В принципе, вопрос можно и такой поставить:
почему правила

Code: Select all

0   "^\s*(\d+)\s*`(.*)`\s*`\s*\\(\d*)=\((.*)?,(.*)?,(.*)?\)\s*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
и

Code: Select all

0   "^\s*(\d+)\s*`(.*)?`\s*`\s*\\(\d*)=\((.*)?,(.*)?,(.*)?\)\s*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
не срабатывают на таком примере:
Image

Code: Select all

0	`^\s*(#NoEnv)([^;]*?)(\s*(;|$))?` `\1=(2,${AREA},0)`
?

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Drugmix
правила с одним условием раскраски, как в Вашем примере, подсвечиваются, например, так:

Code: Select all

"^(\d+)\s+`(.*)`\s+`(\\(\d*)=\((.*),(.*),(.*)\)\s*)+`\s*$"
проблема с раскраской нескольких одинаковых групп - тот самый "+" после последней закрывающей скобки: подсветится только последняя группа из набора одинаковых \1=(...) \2=(...) ...

P.S. Обратил на это внимание, балуясь с подсветкой времени - пример выше

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Serge Yolkin
+ - это частный случай * и в первом сообщении я уже описал этот вариант.
Создать правило для правила только с заранее известным количеством условий раскраски - я и сам могу.
Вопрос был в том, как написать 1 универсальное правило, которое будет разукрашивать правила с любым количеством условий раскраски.

Или услышать ответ, что такое невозможно. Тогда бы я просто создал n похожих правил на n вариантов количества условий раскраски.

p.s.: заметил, что обсуждение регулярок - само по себе довольно сложно.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Тогда это вопрос к Инструктору:

Instructor, почему правило

Code: Select all

1 `(что)\-(то)(\sтам)+` `\3=(0,#ff0000,0)`
в строке

Code: Select all

что-то там там там
подсвечивает только последний "там"? Это фича?

Опа! Именно в этом случае подсвечивает все! Надо поэкспериментировать...

Ага! А правило

Code: Select all

1 "(что)(\-(то))?(\s`(там)`)+" "\3=(0,#ff0000,0) \5=(0,#0000ff,0)"
для строки

Code: Select all

что-то `там` `там` `там`...
подсвечивает только последнее `там`.

Вероятно, проблема с вложенными скобками:

Code: Select all

1 "(что)\-(то)(\s`(там)`)+" "\3=(0,#0000ff,0)"
; работает правильно
1 "(что)\-(то)(\s`(там)`)+" "\4=(0,#0000ff,0)"
; подсвечивает только последнее вхождение
Кавычки не при делах - что с ними, что без.
Locked