Sublime Text - C ++亮点

时间:2014-04-17 23:43:05

标签: syntax-highlighting sublimetext

如何将我的类突出显示为普通的原始类型,如int或double?

见例子:

enter image description here

当我宣布Test aloha;测试的方式与int a相同时,我希望这样做。

2 个答案:

答案 0 :(得分:15)

语法突出显示由tmLanguage文件控制。在ST3中,它们保存在.cache文件中。

请按照以下步骤操作。

  • 打开工具 - >命令托盘并使用Package Manager安装PackageResourceViewer
  • 在Command Pallet中选择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>

我选择了那个,因为它涉及一些常规表达(正则表达式)匹配,并且提示你做你想做的事。

因为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>

现在我需要编写正则表达式来识别我的新语言组件。这很简单,因为我将假设我们都遵循相当标准的做法,即使用前导Caps命名我们的类,而不是将其用于其他语言组件,所以我的正则表达式只需要找到以UPPERCASE alpha开头的任何字符串,很容易定义为[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

  • 在Command Pallet中选择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中的琐事,使其完全按照您的喜好工作。也许我上面的正则表达不太好?我没有考虑过这么多,所以你可能会发现你需要在那里做更多的工作才能得到你想要的东西。

让我知道其中一些是否有意义并且我会尝试做得更好。

答案 1 :(得分:4)

我还建议安装软件包Scope Hunter,然后通过Toggle Instant Scoper启用Ctrl+Shift+P。这将显示光标下元素的范围。

通过这个,您可以看到ST如何解析文件,并使用主题定义中每个范围的名称来不同地为不同范围的元素着色。