Если вашей конечной целью является добавление подсветки синтаксиса к именам переменных в том месте, где они объявлены , но нигде в файле , к сожалению, вы не можете сделать это что вы пытаетесь сделать здесь.
Причина этого заключается в том, что правила в определении синтаксиса определяют то, что различные части файла представляют, основываясь исключительно на контексте, в котором они найдены и распознаны в входной файл без какой-либо (пригодной для использования) записи о том, что имел в виду текст.
Таким образом, за исключением точки, в которой объявлена переменная, нет ничего, что могло бы сказать определению синтаксиса, что имя переменной является специальным, чтобы она могла применить ту же область позже.
Чтобы проиллюстрировать это, вот несколько примеров бессмысленного кода, выделенного существующим определением синтаксиса C ++:
#define var X
int var = 10;
var = 29;
В первой строке синтаксис определение видит, что есть токен #define
, что означает, что это начало директивы препроцессора. Исходя из этого, он знает, что var
в этой строке является именем макроса, и ему присваивается область действия source.c++ meta.preprocessor.macro.c++ entity.name.constant.preprocessor.c++
, которая позволяет подсветке синтаксиса знать, что это именованная сущность, являющаяся значением препроцессора; Правило для этого в моей цветовой схеме окрашивает его в зеленый цвет.
Однако тот факт, что var
особенный, нигде не сохраняется, потому что Sublime не компилирует код, он просто смотрит на него лексически (как серия токенов).
Следовательно, в строке 2 можно определить, что int
является внутренним типом, что =
является оператором, а 10
является числом, он не помнит var
раньше был директивой препроцессора. Не существует правила, которое помечает его как переменную, поэтому это просто текст с незаданной областью.
Конечно, возможно применить правило, которое будет срабатывать в строке 2, и применить вашу область видимости к тексту * 1033. *; в этой указанной строке c можно сделать вывод, что это, вероятно, имя переменной, так же как строка 1 может сказать, что это макрос препроцессора.
Причина, по которой синтаксис по умолчанию не работает это уже потому, что он позволял бы только подсветку синтаксиса var
в строке, где он объявлен, и нигде больше, что не очень полезно.
По аналогичным причинам пользовательские типы, определенные с помощью typedef
aren Также не распознается в объявлениях переменных. Вы также можете заметить, что имя класса распознается как таковое в определении класса, конструкторе и деструкторе, но не в качестве возвращаемого типа в методах, и при вызове конструктора вместо этого оно рассматривается как вызов функции.
Причина, по которой приведенная выше корректировка синтаксиса ни на что не влияет, заключается в том, что она предоставляет новый контекст, но нигде не включает его, поэтому он фактически отключен. Как работают определения синтаксиса, довольно сложно, но вкратце вы предоставили новый именованный набор (context
) match
правил, но без указания определения синтаксиса, где они должны применяться, они ни на что не влияют.