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