为 c++ st3 创建变量语法突出显示

Create variable syntax highlighting for c++ st3

所以我想在 sublime text 3 上为我的自定义 c++ 主题实现变量语法突出显示。所以我想创建一个自定义范围,然后在我的 tmTheme 文件上使用,所以我去添加默认的 sublime text c++ 语法并添加这个来检测变量:

c++.sublime-syntax:

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++

这是我的objective: 如果字符串包含大写,小写,数字 AND 是字符串形式 -> 一个 space 或多个 -> 一个等号(=) OR 字符串只有一个分号被捕获。

所以在这种情况下,我有两个捕获组,第一个将匹配变量名称,并将被视为 variable.other.name.member.c++,第二组将是分号或相等的和附加的 spaces,将被视为 variable.other.name.end.c++.

以下是我期望从 sublime text 识别为变量并为它们分配我包含在 sublime-syntax 文件中的自定义范围的一些示例:

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

现在我保存了这个文件并试图显示变量的范围,它只是将它识别为 source.c++ 所以我的代码不起作用,你们有什么想法吗?谢谢提前

除非您的最终目标是在变量名称的声明处添加语法高亮显示但在文件的其他任何地方, 不幸的是你不能在这里做你想做的事。

原因是语法定义中的规则仅根据在输入文件中找到和识别它们的上下文来确定文件的不同部分代表什么,而不保留任何(可用)记录文字的意思。

因此,除了声明变量的地方,没有任何东西可以告诉语法定义变量的名称是特殊的,以便以后可以应用相同的范围。

为了帮助说明这一点,这里有一些示例代码,如现有 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 行触发的规则并将范围应用于文本 var;在该特定行中,可以推断它可能是一个变量的名称,就像第 1 行可以告诉它它是一个预处理器宏一样。

默认语法不这样做的原因是因为它只允许在声明它的行中突出显示语法 var 而在其他任何地方都没有,这不是很有帮助。

出于类似的原因,通过 typedef 定义的自定义类型在变量声明中也无法识别。您可能还注意到 class 的名称在 class 定义、构造函数和析构函数中被识别为这样,但在方法中不是 return 类型,并且在调用构造函数时它是被视为函数调用。

你上面的语法调整没有任何影响的原因是它提供了一个新的上下文但没有在任何地方包含它,所以它被有效地禁用了。语法定义的工作原理相当复杂,但简而言之,您提供了一个新的 match 命名集 (context) 规则,但没有告诉语法定义应该在哪里应用它们,它们没有任何效果在任何事情上。