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реализация, которая сочетает в себеHighlightedLines от несколькихDocumentHighlighters. это подход, который мы используем для семантического выделения C# в SharpDevelop 5 ,который работает как дополнительный маркер, который расширяет существующий.подсветка C# на основе xshd. Однако этот подход является сложным (слияниеHighlightedLines нетривиально с учетом ограничений упорядочения и вложенности в разделах), и требует изменения API наIHighlighterинтерфейс для того, чтобы разобраться сOnHighlightStateChangedуведомление (AvalonEdit 4.x использует производный класс, вложенный вHighlightingColorizerчтобы получить доступ к этому обратному вызову; AvalonEdit 5.0 будет использовать событие).