Разделители

Разделители претерпели много изменений в UDL 2.0.
Наиболее очевидным отличием является GUI, поэтому мы начнем с него.

Разделитель 1

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 2

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 3

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 4

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 5

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 6

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 7

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Разделитель 8

Стиль

Открывающие теги

v

Экранирующий символ

v

Закрывающие теги

v

Также как и ключевые слова, количество разделителей была увеличено до 8 (как было предложено Don'ом), если необходимо больше, пожалуйста, укажите это в дискуссии на форуме Notepad++. Каждый разделитель теперь имеет свой экранирующий символ.
Также произошли многочисленные изменения под капотом, и мы рассмотрим их здесь через серию коротких примеров.

Пример 1:

Разделитель 1

Стиль

Открывающие теги

"

Экранирующий символ

\

Закрывающие теги

"

Первый пример представляет собой простую строку C++.
Ничего особенного здесь.

1 "Это строка"
2
3"ещё строка с \"экранирующим\" символом"
4

Пример 2:

Разделитель 3

Стиль

Открывающие теги

//

Экранирующий символ

Закрывающие теги

((EOL))

Пример 2 немного более интересный.
Это попытка задать строку комментария.
Обратите внимание, как специальный оператор UDL (( )) преобразует аббревиатуру "EOL" в символ конца строки. На самом деле он преобразует его в вектор из трех строк:
Таким образом он найдет конец строки независимо от формата файла (unix/dos/osx)

1 // "Разделител 3" работает как
2// однострочный комментарий
3

Пример 3:

Теги однострочного комментария


Стиль


Открывающие теги

//

Тег переноса на след. строку

(( \ ??/ ))

Закрывающие теги

Еще один интересный пример. Строка комментария C++ поддерживает продолжение на следующей строке, и есть только один символ продолжения: обратная наклонная черта (\)

Но есть одна хитрость, стандарт C++ также определяет некоторые двухсимвольные и трёхсимвольные комбинации. Трёхсимвольная комбинация для обратной наклонной черты является "??/" (двойной вопросительный знак перед идущим впереди слешем)

Таким образом, чтобы иметь завершённое определение строки комментария C++, нужно определить оба варианта продолжения. В UDL 2.0 вы сделаете это с помощью специального оператора (( )).
То есть, внутри специального оператора (( )) задаётся несколько взаимозаменяемых тегов.

1
2// Однострочный комментарий С++ \
3 переносится на следующую строку ??/
4 даже при трёхсимвольном теге
5

Пример 4:

Теги однострочного комментария


Стиль


Открывающие теги

// #

Тег переноса на след. строку

(( \ ??/ )) \

Закрывающие теги

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

Вторая вещь для понимания является группировка символов продолжения.
Строка комментария C++ (первая группа) определяет два тега продолжения. Строка комментария Python определяет только один тег продолжения.

С помощью группировки с оператором (( )) удалось обеспечить логику индексации и выравнивание столбиком (как описано в разделе комментариев) и убедиться, что "??/" применяется только к строке комментариев C++.

1
2// Однострочный комментарий С++ \
3 переносится на следующую строку ??/
4 даже при трёхсимвольном теге
5
6
7// Однострочный комментарий Python \
8 переносится на следующую строку ??/
9 но не для трёхсимвольного тега
10

Пример 5:

Разделитель 4

Стиль

Открывающие теги

(( (( ))

Экранирующий символ

Закрывающие теги

(( ))))

Если вам нужно использовать двойные скобки "))" и "((" в качестве открывающего или закрывающего тегов разделителя, просто задайте их внутри оператора (( )).
Существует единственное исключение из правил, где пробел нельзя свободно использовать. Чтобы задать тег "))" внутри специального оператора (( )), вы должны тег и закрывающий оператор задать слитно, не разделяя пробелом, т.е. 4 последовательных закрывающих скобки. Иначе вы зададите пустую группу в качестве ключевого слова, так как тег будет интерпретироваться как закрывающий оператор.

1
2(( Разделитель 4 ))
3

Вложенность разделителей

Комментарии и разделители поддерживают вложенность, и это может использоваться для определения некоторых сложных операций.

Пример 6:

Язык CoffeScript задаёт собственный синтаксис регулярных выражений, который называется hereRegex. Забавно, синтаксис hereRegex поддерживает комментарии внутри регулярного выражения, но:
Комментарии в hereRegex является все после символа #, но только если он без последующего ' {'.
Как нам решить эту головоломку в UDL 2.0?

Разделитель 1

Стиль

Открывающие теги

///

Экранирующий символ

Закрывающие теги

///

Разделитель 2

Стиль

Открывающие теги

#{

Экранирующий символ

Закрывающие теги

}

Разделитель 3

Стиль

Открывающие теги

#

Экранирующий символ

Закрывающие теги

((EOL))

Разделитель 4

Стиль

Открывающие теги

Экранирующий символ

Закрывающие теги

Нам необходимо задать 3 разделителя.
Разделители 1 и 2 имеют одинаковый стиль, а разделитель 3 имеет отличающийся стиль
Кроме того разделитель 1 позволяет вложенные разделители 2 и 3.

1
2///
3 ^ # комментарий
4 #(@num) # ещё комментарий
5 xyz
6 \s*[-+*/]
7 $
8///
9
Когда все теги уже заданы, hereRegex подсвечивается, как и ожидалось, с отдельным стилем в строках комментария.
Это возможно, потому что UDL 2.0 обрабатывает разделители, начиная с 1-го и заканчивая 8-ым.
Когда обработчик достигает тег "#{" он обнаруживает его как Разделитель 2, потому, что Разделитель 2 проверяется раньше чем Разделитель 3.

Таким образом, когда Разделители перекрываются, нужно более длинный ставить всегда первым!