Создать переменную подсветку синтаксиса для c ++ st3 - PullRequest
0 голосов
/ 04 февраля 2020

Итак, я хочу реализовать переменную подсветку синтаксиса для моей пользовательской темы c ++ для возвышенного текста 3. Поэтому я хотел создать настраиваемую область видимости, чтобы затем использовать ее в своем файле tmTheme, поэтому я решил добавить к стандартному синтаксису возвышенного текста c ++ и добавил это для определения переменных:

c ++. sublime-синтаксис:

contexts:
  main:
    - include: preprocessor-global
    - include: global

  # my custom scope
  normal-variables:
    - match: '([a-zA-Z0-9_]+(\ +=|;))'
      captures: 
        1: variable.other.name.member.c++
        2: variable.other.name.end.c++

Вот моя цель : если строка содержит прописные и строчные буквы, числа И имеют вид строки -> один пробел или более -> один знак равенства (=) ИЛИ строка содержит только точку с запятой, которую она захватывает.

И поэтому в этом случае у меня есть две группы захвата, первая из которых будет соответствовать имени переменной и будет рассматриваться как variable.other.name.member.c ++ , а вторая группа будет точкой с запятой или аналогичной и дополнительные пробелы и будут рассматриваться как variable.other.name.end.c ++ .

Вот некоторые примеры того, что я ожидаю от возвышенного текста, чтобы распознать в качестве переменных и назначить им пользовательские Области я включенный в файл sublime-syntax:

//var has to be captured
int var = //in the format anyVarName = 
//or
int var;//in the format anyVarName;

Теперь я сохранил этот файл и попытался показать область видимости переменной, а он просто распознал ее как source.c ++, поэтому мой код не работает, не могли бы вы ребят есть идеи?. Заранее спасибо

1 Ответ

1 голос
/ 07 февраля 2020

Если вашей конечной целью является добавление подсветки синтаксиса к именам переменных в том месте, где они объявлены , но нигде в файле , к сожалению, вы не можете сделать это что вы пытаетесь сделать здесь.

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

Таким образом, за исключением точки, в которой объявлена ​​переменная, нет ничего, что могло бы сказать определению синтаксиса, что имя переменной является специальным, чтобы она могла применить ту же область позже.

Чтобы проиллюстрировать это, вот несколько примеров бессмысленного кода, выделенного существующим определением синтаксиса C ++:

#define var X
int var = 10;
var = 29;

Syntax highlighting definition

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

...