+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 94.09 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

VS2010 - делаем свою подсветку синтаксиса

09.03.2010 16:46

Поставил у себя VS2010 RC1. На винчестере семь гигов занимает, однако.

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

Для примера решил сделать подсветку синтаксиса для ассемблера Z80.
Первые результаты удалось получить через пару часов, ещё за пару часов сделал однострочный разбор - метки, комментарии, операторы и псевдо-операторы:

image

В Visual Studio 10 применяется новая модель расширений - весь код аддонов пишется исключительно на managed-коде, никаких COM. Это очень серьёзно облегчает жизнь, да и на общей стабильности системы сказывается очень положительно.

Собственно, к делу. Во-первых, существует несколько способов распространения расширений студии, я использовал VSIX - наиболее удобно для отладки. Имеет смысл поставить Microsoft Visual Studio 2010 SDK - студия дополняется шаблонами проектов для быстрого создания расширений. Но насколько я понимаю создавать их можно и так. С использованием VS2010 SDK новый проект для кастомной подсветки синтаксиса создаётся через пункт Extensibility > Editor Classifier.

Подсветка синтаксиса определяется классом, реализующим интерфейс IClassifier - этот класс задаёт логику разбора текста. Для использования классификатора нужен провайдер - реализующий IClassifierProvider и определяющий как наш классификатор будет использоваться.

    [Export(typeof(IClassifierProvider))]
    [ContentType("text")]
    internal class Z80EditorClassifierProvider : IClassifierProvider
    {
      [Import]
      internal IClassificationTypeRegistryService ClassificationRegistry = null; // Set via MEF

      public IClassifier GetClassifier(ITextBuffer buffer)
      {
        return buffer.Properties.GetOrCreateSingletonProperty<Z80EditorClassifier>(
          delegate { return new Z80EditorClassifier(ClassificationRegistry); });
      }
    }


Основной метод классификатора - GetClassificationSpans() - для заданного фрагмента текста функция должна возвратить список фрагментов с указанием типа фрагмента - класса, реализующего интерфейс IClassificationType.

    class Z80EditorClassifier : IClassifier
    {

      public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
      {
        List<ClassificationSpan> result = new List<ClassificationSpan>();

        ...

        return result;
      }

    }

 

При этом из GetClassificationSpans() конечно можно получить доступ к разбираемому тексту - через свойство span.Snapshot. В моём случае меня интересовал простой синтаксис, сводящийся к разбору одной строки.

    public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
    {
      List<ClassificationSpan> result = new List<ClassificationSpan>();
      if (span.Length == 0) return result;
      
      ITextSnapshot snapshot = span.Snapshot;
      ITextSnapshotLine line = snapshot.GetLineFromPosition(span.Start.Position);
      ITextSnapshotLine endLine = snapshot.GetLineFromPosition(span.End.Position);

      while (true)
      {
        // Process current line
        ProcessLine(line, result);

        if (line.LineNumber == endLine.LineNumber)
          break;
        // Next line
        line = snapshot.GetLineFromPosition(line.EndIncludingLineBreak + 1);
      }

      return result;
    }

 

Внутри ProcessLine остаётся идентифицировать отдельные фрагменты строки и добавить их в список, указав для каждого тип фрагмента. Например, вот так добавляется подсветка для комментария:

        IClassificationType commentClassifType = registry.GetClassificationType("z80comment");
        result.Add(new ClassificationSpan(
          new SnapshotSpan(line.Snapshot, new Span(line.Start + commentPos, commentLength)),
          commentClassifType));

 

Типы фрагментов можно описать все сразу в одном классе:

  internal static class Z80EditorClassifierClassificationDefinition
  {
    /// <summary>
    /// Defines the "z80operator" classification type - Z80 Assembly Operator.
    /// </summary>
    [Export(typeof(ClassificationTypeDefinition))]
    [Name("z80operator")]
    internal static ClassificationTypeDefinition Z80OperatorDefinition = null;

    /// <summary>
    /// Defines the "z80comment" classification type - Z80 Assembly Comment.
    /// </summary>
    [Export(typeof(ClassificationTypeDefinition))]
    [Name("z80comment")]
    internal static ClassificationTypeDefinition Z80CommentDefinition = null;
  }

 

Классификатору может быть сопоставлен форматтер - класс, порождённый от ClassificationFormatDefinition и определяющий способ подсветки текста.

  [Export(typeof(EditorFormatDefinition))]
  [ClassificationType(ClassificationTypeNames = "z80operator")]
  [Name("z80operator")]
  [UserVisible(true)]
  [Order(Before = Priority.Default)]
  internal sealed class Z80EditorOperatorFormat : ClassificationFormatDefinition
  {
    public Z80EditorOperatorFormat()
    {
      this.DisplayName = "Z80 Assembly Operator";
      this.BackgroundColor = Color.FromRgb(230,255,230);
      this.ForegroundColor = Colors.Blue;
    }
  }

 

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

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года