我正在努力找出如何使用新的.sublime-syntax样式定义在Sublime Text 3中创建一个新的语法高亮(大多数先前的答案与旧方法有关).
从Sublime Text Build 3084开始,添加了一个新的语法定义格式,扩展名为.sublime-syntax.
我能找到:
语法规则
范围命名规则
配色方案规则
但是我找不到最基本的信息,详细说明这些如何结合在一起!
我不是想创建一个主题,或者调整现有的语法定义.我只想为具有我计划用于我自己目的的扩展名的文件创建语法高亮显示.
在语法定义中,我必须指定一个范围(例如scope:source.c)但是该范围文件在哪里生效?或者更确切地说,我在哪里创建我的范围文件,以及如何命名它,以便它加载?
我如何知道我的语法文件及其使用的范围文件是否已成功加载和应用?
是否有任何编译或刷新步骤,或一切都自动重新加载?
谢谢.
1> OdatNurd..:
关于如何创建自定义语法的完整讨论远远超出了Stack Overflow应答这样简单的范围.另外我认为你使你的问题比实际上更复杂(尽管创建语法通常非常复杂).
为了引导您完成创建自定义语法所需的步骤,这是一个示例.
首先,创建一个包含以下内容的文件,并将其保存在某处sample.ec
,然后保持文件处于打开状态:
// This is a line comment
if (x == 2)
y = 1
else
z = 1
您会注意到此文件的语法设置为Plain Text
(请参阅右下角的状态行),这是Sublime未知的文件的默认语法.
现在,Tools > Developer > New Syntax...
从菜单中选择.将出现具有以下内容的缓冲区.使用File > Save
保存文件; 该位置将默认为您的User
包.您提供的名称并不重要,但请确保扩展名为sublime-syntax
.在我的例子中,我正在调用我的文件Sample.sublime-syntax
.
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
file_extensions:
- ec
scope: source.example-c
contexts:
main:
# Strings begin and end with quotes, and use backslashes as an escape
# character
- match: '"'
scope: punctuation.definition.string.begin.example-c
push: double_quoted_string
# Comments begin with a '//' and finish at the end of the line
- match: '//'
scope: punctuation.definition.comment.example-c
push: line_comment
# Keywords are if, else for and while.
# Note that blackslashes don't need to be escaped within single quoted
# strings in YAML. When using single quoted strings, only single quotes
# need to be escaped: this is done by using two single quotes next to each
# other.
- match: '\b(if|else|for|while)\b'
scope: keyword.control.example-c
# Numbers
- match: '\b(-)?[0-9.]+\b'
scope: constant.numeric.example-c
double_quoted_string:
- meta_scope: string.quoted.double.example-c
- match: '\\.'
scope: constant.character.escape.example-c
- match: '"'
scope: punctuation.definition.string.end.example-c
pop: true
line_comment:
- meta_scope: comment.line.example-c
- match: $
pop: true
现在打开Sublime Console View > Show Console
或按相关的键绑定.你会看到控制台的最后一行是这样的:
generating syntax summary
保持控制台处于打开状态,单击语法文件并再次执行另一个保存操作,而不进行任何更改.同一行再次出现在控制台中.
是否有任何编译或刷新步骤,或一切都自动重新加载?
如此处所示,每次修改语法定义时,都会重新编译文件并缓存结果.所以没有编译步骤(除了保存),你不需要做任何事情来刷新任何东西.
现在让我们将注意力转回示例文件.它仍然是开放的,语法仍然表明它是Plain Text
.
现在关闭文件并重新打开它; 一个快捷方式是使用File > Open Recent > Reopen Closed File
或它的关联键绑定.
请注意,现在该文件已重新打开,有几处更改.首先,窗口右下角的语法名称Sample
(或者您在sublime-syntax
上面命名的文件).另一方面,文件的内容现在突出显示语法.
您看到的颜色取决于您使用的颜色方案,但示例可能如下所示:
// This is a line comment
if (x == 2)
y = 1
else
z = 1
我如何知道我的语法文件及其使用的范围文件是否已成功加载和应用?
您可以看到语法文件是在保存更改时由于缺少错误消息而编译的,您可以通过尝试使用语法来判断它是否已应用.
这里的语法是自动使用的,但您会发现如果您View > Syntax
在菜单中检查或单击窗口右下角的当前语法名称,您的语法将出现在那里.类似地,命令调色板中现在有一个名为Set Syntax: Sample
(或者其他)的条目.
这引导我们进入你的最后一个问题.如果你回到你的sublime-syntax
文件,你会在顶部看到这个:
# See http://www.sublimetext.com/docs/3/syntax.html
file_extensions:
- ec
scope: source.example-c
首先要注意的是file_extensions
include ec
,我们的示例文件被调用sample.ec
; 因此,由于它的名称,此语法会自动应用于此语法.
现在切换到sample.ec
文件,将光标放在缓冲区中的某个位置,然后使用Tools > Developer > Show Scope Name
或按相关键.
弹出窗口的内容将根据光标所在文件的位置而有所不同,但常见的一点是,显示的范围始终以source.example-c
.
在语法定义中,我必须指定一个范围(例如scope:source.c)但是该范围文件在哪里生效?或者更确切地说,我在哪里创建我的范围文件,以及如何命名它,以便它加载?
如此处所示,没有"范围文件"这样的东西; 该sublime-syntax
文件直接将范围指定为语法规则的一部分,因此它是您创建语法时唯一需要创建的文件.它可能看起来像文件名,但它不是一个.
语法中的语法匹配规则中应用的范围需要与颜色方案中的范围一致才能突出显示语法; 这就是为什么你应该使用范围命名规则来使用所有语法共享的通用范围集,除非你还计划制定一个颜色方案以配合你的语法,但除非你使用推荐的范围,否则你的语法会赢得'与其他颜色方案配合良好,您的配色方案不适用于其他语法.
从这个起点开始,您可以在sublime-syntax
此处修改文件,以便按照您希望的方式突出显示文件.这将包括更改顶部的基本范围,应用适当的扩展,然后包括与您的语言匹配的所有规则.
如上所述,创建匹配文件的实际规则是创建语法最复杂的部分,除非您的文件格式非常简单.它超出了可以在Stack Overflow答案中传达的范围,但上面链接的官方文档为您提供了一些信息.
除了查看现有语法文件以了解他们如何做他们所做的事情之外,您还可以在Sublime论坛上提出更多有针对性的问题.