Возвышенный текст - C++ Highlight

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

Смотрите пример:

введите описание изображения здесь

Я хочу это, когда я объявляю Test aloha; Тест должен быть выделен так же, как int a,

2 ответа

Решение

Подсветка синтаксиса контролируется файлом 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, чтобы работать именно так, как вам нравится. Возможно, мое регулярное выражение не слишком велико? Я не особо задумывался об этом, поэтому вы можете найти, что вам нужно больше работать там, чтобы получить именно то, что вы хотите.

Дайте мне знать, если что-то из этого не имеет смысла, и я постараюсь сделать лучше.

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

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

Другие вопросы по тегам