AvalonEdit: Каскадное Выделение Цветов
Я хочу каскадировать SyntaxHighlighting двигатель AvalonEdit. У меня есть 2 HighlightingDefinitions
. Первый-это основной синтаксис. Второй-сложный многострочный препроцессор-язык разметки. По этой причине слишком сложно встроить вторую грамматику в первую. Более простой способ-это визуализация первого синтаксиса и последующее изменение затронутых частей строки (на основе второго синтаксиса).
поэтому я создал новый HighlightingColorizer
со вторым языком и добавил его к LineTransformers
. Но второй язык окрашивает весь документ, а не только линейные части с директивами препроцессора: код без препроцессора черный.
как я отладил ColorizeLine
-метод второй линии трансформатора, строки не выделенного кода (=нет кода препроцессора) не были раскрашены, как ожидалось. Но цвет линий черный.
так же HighlightingColorizer
сбросить все предыдущие выделения всего документа, прежде чем он начнет раскрасить?
или в чем еще может быть проблема? Как я могу правильно каскадировать 2 HighlightingColorizers
?
1 ответ:
проблема в том, что
HighlightingColorizer
не хранит непосредственно ссылку наDocumentHighlighter
, но вместо этого сохраняет его черезTextView.Services
. Это делается для того, чтобы прикреплять же colorizer с несколькими редакторами, так что каждый редактор имеет свой собственныйDocumentHighlighter
.когда вы прикрепляете второй колоризатор, он перезаписывает
IHighlighter
хранящиеся в контейнере; и оба colorizers в конечном итоге с помощью нового маркера.кроме того, обратите внимание, что логика "копировать в буфер обмена" в
HtmlClipboard
прямой доступ кIHighlighter
службы, он не использует никаких colorizers. (копирование текста в Word сохраняет только подсветку синтаксиса, никаких других преобразований, таких как маркеры сгиба)есть по существу два подхода к решению этой проблемы:
не храните дополнительный маркер в качестве сервиса. Вы можете сделать это, создав свою собственную копию
HighlightingColorizer
класс, и использовать поле в этом классе вместо доступаtextView.Services
. Это простое изменение, но дополнительные маркеры не будут использоваться при копировании текста в буфер обмена.создать
IHighlighter
реализация, которая сочетает в себеHighlightedLine
s от несколькихDocumentHighlighter
s. это подход, который мы используем для семантического выделения C# в SharpDevelop 5 ,который работает как дополнительный маркер, который расширяет существующий.подсветка C# на основе xshd. Однако этот подход является сложным (слияниеHighlightedLine
s нетривиально с учетом ограничений упорядочения и вложенности в разделах), и требует изменения API наIHighlighter
интерфейс для того, чтобы разобраться сOnHighlightStateChanged
уведомление (AvalonEdit 4.x использует производный класс, вложенный вHighlightingColorizer
чтобы получить доступ к этому обратному вызову; AvalonEdit 5.0 будет использовать событие).