4

如何更改 VSCode 中的语法突出显示以使其符合特定的样式指南?例如,我想遵守Google C++ 风格指南,其中成员变量写为some_member_variable_. 当我使用此约定时,VSCode 不会为该名称着色与标准文本不同。但是我有一些使用mSomeMemberVariable约定的代码,并且它的颜色确实与其他文本不同。有没有办法更好地配置它?

4

1 回答 1

3

TL;DR >没有简单的方法来应用谷歌风格的语法突出显示,除非你找到一个现有的 cpp Textmate 语法文件(我找不到)。但是,以下是您自己实现它的方式。

查看 CPP 语法文件 ( cpp.tmLanguage.json),我们看到没有捕获 Google 样式成员变量的范围模式。您可以添加一个:

{ // this is the existing scope that matches mSomeMemberVariable
    "match": "\\b(f|m)[A-Z]\\w*\\b",
    "name": "variable.other.readwrite.member.cpp"
},
{ // you can add this scope to match some_member_variable_
    "match": "\\b([a-z][a-z\\d]*_)+\\b",
    "name": "variable.other.readwrite.member.google.cpp"
}

现在,您可以通过确保其范围(或任何外部范围,如 )来确保它的样式在您的主题文件variable.other.readwrite.member中具有主题规则。.json


以下是更详细的解释。从这里我们看到:

语法高亮有两个组成部分:

  • 使用语法将文本分解为标记和范围列表
  • 然后使用主题将这些范围映射到特定的颜色和样式

首先,我们需要弄清楚哪个“范围”正在设置成员变量的样式:

  • 命令面板ctrl+shift+p>>Developer: Inspect TM Scopes
  • 点击成员变量名 ( mSomeMemberVariable)
  • 最具体的范围是最顶部的条目。在这篇文章中,它被称为variable.other.readwrite.member.cpp

名称的.cpp一部分告诉我们,作用域是在 C++ 语法(语法)中定义的。到目前为止,用于 cpp 语法的文件可以在下面找到[applications_folder]/code/resources/app/extensions/cpp/syntaxes/cpp.tmLanguage.json(参见github repo中的文件)。

在语法定义文件中搜索作用域名称,我们发现如下模式:

{
    "match": "\\b(f|m)[A-Z]\\w*\\b",
    "name": "variable.other.readwrite.member.cpp"
}

要查看将什么样式应用于上述范围,我们查看活动主题的*.json文件。例如,如果您使用的是Dark+(默认深色)主题,您可以在extensions/theme-defaults/themes/dark_plus.json. 在此文件中,我们找到以下文本配对主题规则:

{
    "name": "Variable and parameter name",
    "scope": [
        "variable",
        "meta.definition.variable.name",
        "support.variable",
        "entity.name.variable"
    ],
    "settings": {
        "foreground": "#9CDCFE"
    }
}

从这个规则中我们看到高亮是由variable范围应用的。(请注意,所有外部范围样式都应用于内部样式,除非您专门指定内部范围样式来覆盖它)
现在您可以选择将自己的范围添加到现有文件中。另一种方法是编辑现有范围以匹配 Google 样式成员变量正则表达式模式。另一种选择是根据 CPP 扩展样式文件定义您自己的语法,并创建您自己的 Google CPP VSCode 扩展。例如,采用第一种方法,您可以编辑cpp.tmLanguage.json如下:

{
    "match": "\\b([a-z][a-z\\d]*_)+\\b",
    "name": "variable.other.readwrite.member.google.cpp"
}

PS 编辑 json 文件后,重新启动 VSCode 以使更改生效。

于 2019-02-21T21:55:03.583 回答