XBrackets plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v.6.1
+ добавлена информация про лицензию

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v.6.2
- исправлено: изменение цветовой темы не обрабатывалось должным образом
+ несколько исправлений/улучшений
+ новая настройка: Считать " " парой скобок
+ несколько исправлений/улучшений ещё раз
+ теперь галочки для пар " ", ' ' и < > поддерживают три состояния:
[v] Автозакрытие + подсветка
[o] Только подсветка
[ ] Выкл.

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

Post by Serge Yolkin »

DV
В 6.2 не подсвечиваются скобки/кавычки вокруг некоторых наборов символов, например: ^\d+ (при этом вокруг d+ и ^\d - подсвечиваются)

В строчке

Code: Select all

.connectServer('.', 'root\\cimv2')
'.' не подсвечивается, а та же точка на отдельной строке - нормально...

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Serge Yolkin wrote:не подсвечиваются скобки/кавычки вокруг некоторых наборов символов, например: ^\d+ (при этом вокруг d+ и ^\d - подсвечиваются)
В строчке

Code: Select all

.connectServer('.', 'root\\cimv2')
'.' не подсвечивается, а та же точка на отдельной строке - нормально...
Правильно, это из-за неоднозначности:

1. В случае "^\d+" оба символа ^ и + являются разделителями, т.е. парная кавычка с равной вероятностью может находиться как левее, так и правее, например:
" ... "^\d+" ... "

2. В случае ('.' также имеем два разделителя: слева символ скобки ( и справа - точку .
Для иллюстрации рассмотрим кусочек текста из приведенной строки:
('.', '
Какие из двух кавычек предпочесть для установления взаимосвязи между ними?
'.' или ', ' ?

3. В случае '.' с первой кавычкой в начале строки или со второй кавычкой в конце строки ситуация является более однозначной: скорее всего, парная кавычка находится на той же строке.
А вот в случае '.' в обрамлении пробелов слева и справа ситуация неоднозначна.

При неоднозначности принимается решение не подсвечивать ничего, чтобы не ошибиться.
Подробнее см. реализацию функции getDuplicatedPairDirection и использование переменной nDuplicatedPairDirection.
Этот алгоритм не менялся с конца 2011-года, примерно с версии 4.8.

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

Post by Serge Yolkin »

DV wrote:Этот алгоритм не менялся с конца 2011-года
ну-у-у.. тогда могу предположить, что

Code: Select all

highlight.quote_detect_lines=1
highlight.quote_max_lines=1
как-то исправляли ситуацию, а теперь - нет.

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

Post by opk44 »

Serge Yolkin
1. Предположения с режимами highlight/quote не кажутся правдоподобными, т.к., судя по пояснениям, все вертится только вокруг "Delimiters".
2. Определение "исправить ситуацию" не корректно (between two evils 'tis not worth choosing). Но повлиять на ситуацию вы, тем не менее, можете даже сейчас (например через Coder-плагин).
3. Если используются разделители из синтаксической темы (см. в настройках Coder), то поведение подсветки, например, парных кавычек, будет отличаться. Скажем, при принудительном использовании "1с" или "txt" - ваш пример не будет подсвечиваться (как и при выключенном Coder), а вот при принудительном использовании "cpp", "perl" пример уже "подсветится". Из-за различного набора "Delimiters". Т.е. можно, например, подставить "что-нибудь этакое" в графу "Псевдоним для неизвестного файла".
4. Если без Coder, то можно разделители в настройках самого редактора "проредить", но это уж совсем себя надо не любить.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Serge Yolkin,
Вот, нашёл, откуда это всё пошло.
См. первые три сообщения... И это были вы! :)
http://akelpad.sourceforge.net/forum/vi ... &start=198
Суть была в том, что подсвечивалась неправильная пара кавычек, и тогда я специально добавил ещё проверки, чтобы исключить ситуации с ошибочной подсветкой... А чтобы совсем её исключить, при неоднозначной ситуации ничего не подсвечивается.

Теоретически, что ещё можно было бы сделать, так это подсчитывать количество кавычек в близлежащих строках, чтобы определиться с началом и концом всех кавычек. Но на практике это отягощается двумя факторами: 1. кавычка может быть экранирована 2. кавычка может находиться внутри другой пары кавычек (одинарная внутри пары двойных или наоборот) - и тут опять возникнет неоднозначность: что считать началом или концом той пары кавычек, в которой находится другая кавычка? Короче говоря, всё это, конечно, интересно, но чересчур нетривиально.

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

Post by Serge Yolkin »

DV
Ну, да! Оттуда и пошло. И работало все эти годы. А тут - сломалось. Вот доберусь на днях до настольника с бэкапом - скажу точно до какой версии все было хорошо. А то последние месяц-полтора немного занят и невнимателен.

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

Post by Serge Yolkin »

Ну, вот...
5.9 - всё было хорошо;
6.1 - эту версию я пропустил, по крайней мере, её нет в бэкапе;
6.2 - всё сломалось.
Новые версии накатывались поверх, INIшник не менялся:

Code: Select all

[Options]
autocomplete.all_autobr=0
autobrackets.next_char_ok=.,!?:;()[]{}<>=«»`
autocomplete.ovr_autobr=0
autobrackets.prev_char_ok=!;()[]{}<>=«»`
autocomplete.sel_autobr=2
comment1FileExts=hta; htm; html; js; shtml; wsf; xhtml
common.user_brpairs= «» ``
highlight.br_max_lines=0
highlight.hlt_bothbr=1
highlight.hlt_style=3
highlight.quote_detect_lines=1
highlight.quote_max_lines=1
highlightBkRGB=FFFFFF00
highlightRGB=99CCFF00
htmlFileExts=hta; htm; html; shtml; wsf; xaml; xhtml; xml; xsl; xslt; xspf;
optionsFlags=12571
Откатился на 5.9...

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Serge Yolkin wrote:5.9 - всё было хорошо;
6.2 - всё сломалось.
Прошу привести парочку детальных примеров: что конкретно было хорошо, и что (и как именно) сломалось.
Только одного примера будет мало.
Недетализированного примера будет мало. Вот почему: для той же строки

Code: Select all

.connectServer('.', 'root\\cimv2')
подсветка парных кавычек в '.' не работает в том случае, когда Сoder неактивен (в этом случае XBrackets не может определиться с парными кавычками самостоятельно). Если же указать в качестве Syntax theme, к примеру, C++, то тогда парные кавычки подсвечиваются (в этом случае XBrackets берёт информацию о парных кавычках из Coder).

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

Post by Serge Yolkin »

DV
Это фрагмент .coder файла:

Code: Select all

0 `\b(\w+\.){2,}(com|net|org|ru)\b`			`\0=(0,${NUM},0)`
0 `(mshta)((\.)(exe))?\s+(javascript\:)(".+")`		`\1=(0,${TAG},0) \3=(0,${DEL2},0) \4=(0,${TAG},0) \5=(0,${DEL2},0) \6=(0,${STR},0)`
0 `\b([\w()\-]+?)\[(\.)(bat|cmd|com|exe)\]`		`\1=(0,${TAG},0) \2=(0,${DEL2},0) \3=(0,${TAG},0)`
0 `(?<!\.)\b([\w()\-]+?)(\.)(bat|cmd|com|exe)`		`\1=(0,${TAG},0) \2=(0,${DEL2},0) \3=(0,${TAG},0)`
0 `(^|\s)(Cmd)\s`					`\2=(2,${TAG},0)`
раньше (когда было хорошо) кавычки "обратный штрих" (`) подсвечивались вокруг всех пяти приведенных регулярок, сейчас (когда стало плохо) - только вокруг первой и последней.

Вероятно, хотя и не уверен, - сломался упрощенный механизм поиска кавычек только в одной строке (только от начала строки), который я когда-то и выпросил :)

P.S. Coder не отключал - собственно, я его никогда не отключаю...
XBrackets берёт информацию о парных кавычках из Coder
а

Code: Select all

common.user_brpairs=
не?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Serge Yolkin wrote:Это фрагмент .coder файла:(...)
При включенном Coder у меня все пары `` подсвечиваются.
Вывод (одно из трёх):
1) возможно, нужно перегенерить кеш плагина Coder
2) возможно, файл coder.coder был стёрт. Тогда его нужно восстановить
3) возможно, из вашего файла coder.coder пропала строка

Code: Select all

5	3	${STR}	0	"`"	"`"	""	""	""
Serge Yolkin wrote:
XBrackets берёт информацию о парных кавычках из Coder
а

Code: Select all

common.user_brpairs=
не?
Здесь я выразился неполно.
Следует понимать так: при включенном плагине Coder плагин XBrackets сначала "спрашивает" у Coder, есть ли у плагина Coder информация о паре скобок или кавычек, одной из которых является текущая скобка или кавычка возле каретки. Если плагин Coder располагает информацией о такой паре скобок или кавычек, то XBrackets их подсвечивает. Если же плагин Coder выключен или не знает о парной скобке или кавычке, то XBrackets ищет парную скобку или кавычку самостоятельно. А делается это всё только для тех пар скобок и кавычек, которые указаны в настройках XBrackets (в том числе в common.user_brpairs).

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

Post by Serge Yolkin »

1) кэш отключен совсем
2) файл на месте
3) в используемых файлах .CODER совсем нет секций Quotes:, только QuotesRE:, но кавычки ` добавлены в common.user_brpairs плагина (.INI выше приводил, там видно). Теперь так работать не будет?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Serge Yolkin wrote:в используемых файлах .CODER совсем нет секций Quotes:, только QuotesRE:, но кавычки ` добавлены в common.user_brpairs плагина (.INI выше приводил, там видно). Теперь так работать не будет?
Если плагин Coder выключен или не знает о парной скобке или кавычке, то XBrackets ищет парную скобку или кавычку самостоятельно.
При неоднозначности нахождения парной скобки или кавычки плагин XBrackets принимает решение не подсвечивать ничего, чтобы не ошибиться.

Без помощи Coder (когда в соответствующем файле .coder указаны ` ` как кавычки) ни одна версия XBrackets за последние пару лет не подсвечивала первую пару кавычек в строке

Code: Select all

0 `(?<!\.)\b([\w()\-]+?)(\.)(bat|cmd|com|exe)`      `\1=(0,${TAG},0) \2=(0,${DEL2},0) \3=(0,${TAG},0)`
Чтобы быть абсолютно точным, первая пара кавычек могла бы быть подсвечена только в том случае, если бы в настройках AkelPad из Редактор 2 -> Разделители слов были убраны круглые скобки (). Тогда круглые скобки не считались бы разделителями и тогда XBrackets посчитал бы `( ... )` парой кавычек.
Вторая пара `( ... )` подсвечивается, поскольку находится в самом конце строки. В этом случае XBrackets соображает, что правее конца строки ничего не может быть, и трактует `( ... )` как пару кавычек в конце строки.

Хотя... Все эти выкладки наводят меня на мысль, что алгоритм определения парных кавычек можно несколько улучшить без очень больших изменений. Попробую, посмотрю, что выйдет.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

DV wrote:алгоритм определения парных кавычек можно несколько улучшить без очень больших изменений
Да уж, без очень больших изменений - это вовсе не значит, что на это требуется мало времени... Очень много сижу под отладкой, чтобы выявить всевозможные условия и "краевые эффекты" для нового алгоритма поиска. Теперь применяется "оценочное" сравнение, которое при неоднозначности "взвешивает" обе найденные пары кавычек для принятия решения. Пример (символ | обозначает положение каретки):

Code: Select all

`-`| `-`
В данном случае и пробел и минус являются разделителями, так что налицо неоднозначность. Однако, поскольку `-` находится у края строки, то "вес" такой пары кавычек выше, чем у ` ` в середине строки.
Недостатком такого подхода было и остаётся несимметричное поведение в особых случаях. Например, пусть есть строка, расположение кавычек в которой сводится к следующему:

Code: Select all

` ` `
В результате, если щёлкнуть по кавычке в начале строки, то подсветится 1-я и 2-я кавычка. А если щёлкнуть по кавычке в конце строки, то подсветится 2-я и 3-я кавычка. Причина та же самая, что и в предыдущем примере: наличие кавычки у края строки воспринимается как найденная открывающая или закрывающая кавычка.
* Однако, поведение будет другим при указании значения highlight.quote_detect_lines больше 1. Тогда XBrackets будет искать парную кавычку и в соседней строке - и, при нахождении оной, "взвешивать" обе найденные пары кавычек для принятия решения о том, которую из них подсвечивать. Если "вес" обеих пар будет одинаковым, ничего не подсветится (из-за неоднозначности). Пример подобной неоднозначности (символ | обозначает положение каретки):

Code: Select all

`
`|
`
Post Reply