Sublime Text - C++语法高亮

14

如何使我的类像int或double等普通基本类型一样突出显示?

看一个例子:

enter image description here

我希望当我声明 Test aloha; 时,Test与 int a 一样被突出显示。


你能在Sublime Text里做到吗?如果可以的话,我会卸载我电脑上的所有IDE... - Anubian Noob
2个回答

18

语法高亮是由 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>

我选择这个,因为它涉及到一些正则表达式匹配(regex),这是你想做的提示。

由于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>

现在我需要编写正则表达式来识别我的新语言组件。这很容易,因为我假设我们都遵循常规实践,使用首字母大写命名我们的类而不将其用于其他语言组件,所以我的正则表达式只需要查找以大写字母开头的任何字符串,这可以轻松定义为[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完全符合您的喜好。也许我的正则表达式不太好?我没有仔细考虑过,所以您可能需要在那里做更多的工作,以获得您想要的效果。

如果其中某些内容不清楚,请告诉我,我会尽力改进。


太棒了!非常有帮助。 - user3286105
@jwpfox。感谢您提供详细而富有教育性的教程。不幸的是,我无法在按照您上面的说明操作时找到C++.tmLanguage文件。ST3是否将语法高亮设置移到了其他文件中? - herteladrian
现在有一种新的文件格式,请参见https://www.sublimetext.com/docs/3/syntax.html。 - jwpfox

4
我建议安装Scope Hunter包,并通过Ctrl+Shift+P启用Toggle Instant Scoper。这样可以显示光标下元素的范围。
通过此方法,您可以看到ST如何解析文件,并在主题定义中使用每个范围的名称来为不同范围的元素着色。请保留HTML标记。

2
现在很容易快速了解正在发生的事情并探索解析。我刚意识到Sublime Text 3中C++的默认解析比我最初想象的要少得多。或者,使用 Ctrl+Alt+Shift+P 可以在状态栏中显示作用域,而无需安装软件包。 - arthropod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接