我很难找到如何使用新的 .sublime-syntax 样式定义在Sublime Text 3中创建一个新的语法高亮显示(大多数先前的答案与旧方法有关)。
从Sublime Text Build 3084开始,添加了一种新的语法定义格式,扩展名为.sublime-syntax。
我可以找到:
但我找不到最基本的信息,详细说明这些信息如何结合在一起!
我不是要创建主题,也不是调整现有的语法定义。我只想为具有我计划用于我自己目的的扩展名的文件创建语法高亮显示。
感谢。
答案 0 :(得分:8)
关于如何创建自定义语法的完整讨论远远超出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
现在使用View > Show Console
打开Sublime控制台或按相关的键绑定。您将看到控制台中的最后一行是:
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
包含ec
,我们的示例文件名为sample.ec
;因此,这种语法因其名称而自动适用。
现在切换到sample.ec
文件,将光标放在缓冲区中的某个位置并使用Tools > Developer > Show Scope Name
或按相关键。
出现的弹出窗口内容将根据光标所在文件的位置而有所不同,但常见的一点是,显示的范围始终以source.example-c
开头。
- 在语法定义中,我必须指定一个范围(例如范围:source.c)但该范围文件在哪里生效?或者更确切地说,我在哪里创建我的范围文件,以及如何命名它,以便它加载?
醇>
如此处所示,没有"范围文件&#34 ;; sublime-syntax
文件直接将范围指定为syntax rules的一部分,因此它是您创建语法时唯一需要创建的文件。它可能看起来像文件名,但它不是一个。
语法中的语法匹配规则中应用的范围需要与颜色方案中的范围一致才能突出显示语法;这就是为什么您应该使用scope naming rules来使用所有语法共享的通用范围集的原因,除非您还计划make a color scheme继续使用您的语法,但除非您使用推荐的范围,您的语法不能很好地与其他配色方案配合使用,您的配色方案不适用于其他语法。
从这个起点开始,您可以在此修改sublime-syntax
文件,以便按照您想要的方式突出显示文件。这将包括更改顶部的基本范围,应用适当的扩展,然后包括与您的语言匹配的所有规则。
如上所述,创建与文件匹配的实际规则是创建语法最复杂的部分,除非您的文件格式非常简单。它超出了可以在Stack Overflow答案中传达的范围,但上面链接的官方文档为您提供了一些信息。
除了查看现有语法文件以了解他们如何做他们所做的事情之外,您还可以在Sublime forum上提出更多有针对性的问题。
答案 1 :(得分:2)
我将很快回答你的问题,其他人可以随时写一篇更长的指南:
ctrl+`
,它将输出语法加载和潜在错误。您也可以按 ctrl + shift + p 并在缓冲区中写入 Set Syntax:YourSyntax 直接查看。