Sublime Text - С++ Highlight

Как я могу сделать мой класс выделенным как обычный примитивный тип типа int или double?

См. пример:

enter image description here

Я хочу, чтобы при объявлении тега Test aloha; было выделено то же самое, что int a.

Ответ 1

Подсветка синтаксиса контролируется файлом tmLanguage. В ST3 они хранятся в файлах .cache.

Итак, выполните следующие действия.

  • Откройте Инструменты → Командный поддон и с помощью Package Manager установите PackageResourceViewer
  • В командном поддоне выберите PackageResourceViewer: Open Resource
  • В представленной панели выберите C++
  • В представленной панели выберите C++.tmLanguage

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

Посмотрите, как определяются части языка. Если мы ищем class, мы найдем следующее в качестве одного из совпадений:

<dict>
    <key>match</key>
    <string>\b(class|struct)\s+([_A-Za-z][_A-Za-z0-9]*\b);</string>
    <key>name</key>
    <string>meta.class-struct-block.c++</string>
    <key>captures</key>
    <dict>
        . . .
    . . . 
</dict>

Я выбрал этот, потому что он связан с регулярным выражением (регулярным выражением) и подсказкой для выполнения того, что вы хотите сделать.

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

Итак, посмотрим, как это сделать.

Прежде всего, нужно сохранить файл C++.tmLanguage, который мы открыли в редакторе, в нашу папку User.

Мы делаем это как для сохранения оригинала, так и для отката и, потому что это означает, что наша версия в User будет не переписываться каждый раз ST обновления. Способ загрузки ST файлов означает, что дубликаты в папке User заменяют значения в местоположении по умолчанию, поэтому наши версии User имеют приоритет в том, что работает, когда мы используем ST. Круто эй?

Итак, теперь у нас есть собственная версия файла C++.tmLanguage, позволяющая играть с ней.

Найдите определение, которое немного похоже на то, что мы хотим сделать, и продублируем его.

Я собираюсь скопировать это:

<dict>
    <key>match</key>
    <string>\b(class|wchar_t|nullptr_t)\b</string>
    <key>name</key>
    <string>storage.type.c++</string>
</dict>

Первое, что я собираюсь сделать, это решить, что я собираюсь назвать своим новым языковым компонентом.

Я мог бы просто указать ему имя существующего языкового компонента, у которого есть раскраска, которую я хочу иметь. Это имеет то преимущество, что если это имя уже существует в существующих цветовых схемах, я получу выделение бесплатно. Не стесняйтесь делать этот выбор.

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

Итак, я сделаю это изменение в дубликат:

<dict>
    <key>match</key>
    <string>\b(class|wchar_t|nullptr_t)\b</string>
    <key>name</key>
    <string>duncan.name.class</string>
</dict>

Теперь мне нужно написать регулярное выражение для определения моего нового языкового компонента. Это довольно просто, так как я предполагаю, что мы все придерживаемся довольно стандартной практики присвоения имен нашим классам ведущими Caps и не используем их для других языковых компонентов, поэтому моему регулярному выражению просто нужно найти любую строку, которая начинается с альфа-версии UPPERCASE, которая легко определяется как [A-Z], за которым следует любой буквенно-цифровой символ/с. Обратите внимание, что это исключает пунктуацию (например, подчеркивание _), поэтому, если вы используете их в именах классов, вам необходимо развернуть регулярное выражение, чтобы включить эти символы.

Итак, измените условие соответствия для использования этого регулярного выражения:

<dict>
    <key>match</key>
    <string>\b([A-Z][a-zA-Z0-9]+)\b</string>        
    <key>name</key>
    <string>duncan.name.class</string>
</dict>

Теперь у меня есть новый языковой компонент, который мне нужно рассказать о моей теме, как справиться с этим. Я буду работать над темой Amy для этого примера.

Итак, вернемся к полезным PackageResourceViewer следующим образом:

  • В командном поддоне выберите PackageResourceViewer: Open Resource
  • В представленной панели выберите Color Scheme - Default
  • В представленной панели выберите Amy.tmTheme

Теперь у вас есть файл тем для вас.

Снова я хочу сохранить свою копию в папку User, а затем дублировать существующий пример. Я собираюсь дублировать String, но все, что хватит вашей фантазии, прекрасно.

<dict>
    <key>name</key>
    <string>String</string>
    <key>scope</key>
    <string>string</string>
    <key>settings</key>
    <dict>
        <key>foreground</key>
        <string>#999999</string>
    </dict>
</dict>

Теперь я изменил дубликат String, чтобы сделать раскраску для моего нового языкового компонента.

<dict>
    <key>name</key>
    <string>Class Names :: Duncan</string>
    <key>scope</key>
    <string>duncan.name.class</string>
    <key>settings</key>
    <dict>
        <key>foreground</key>
        <string>#999999</string>
        <key>background</key>
        <string>#FFFFFF</string>
        <key>fontStyle</key>
        <string>bold</string>
    </dict>
</dict>

Надеюсь, вы узнаете имена, которые я использую из работы, которую мы сделали выше?

Я выбрал слегка сумасшедший набор предпочтений подсветки синтаксиса, чтобы показать некоторые доступные вам параметры. Иди сюда, играя с идеями.

Все это имеет смысл?

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

Сообщите мне, если некоторые из них не имеют смысла, и я постараюсь сделать лучше.

Ответ 2

Я также предложил бы установить пакет Scope Hunter, а затем включить Toggle Instant Scoper через Ctrl+Shift+P. Это покажет вам область действия элемента под курсором.

С помощью этого вы можете увидеть, как ST проанализировал этот файл, и используйте имя каждой области в определении темы для покраски элементов различной области по-разному.