如何使我的类像int或double等普通基本类型一样突出显示?
看一个例子:
我希望当我声明 Test aloha;
时,Test与 int a
一样被突出显示。
如何使我的类像int或double等普通基本类型一样突出显示?
看一个例子:
我希望当我声明 Test aloha;
时,Test与 int a
一样被突出显示。
语法高亮是由 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完全符合您的喜好。也许我的正则表达式不太好?我没有仔细考虑过,所以您可能需要在那里做更多的工作,以获得您想要的效果。
如果其中某些内容不清楚,请告诉我,我会尽力改进。
Scope Hunter
包,并通过Ctrl+Shift+P
启用Toggle Instant Scoper
。这样可以显示光标下元素的范围。Ctrl+Alt+Shift+P
可以在状态栏中显示作用域,而无需安装软件包。 - arthropod