语法定义(旧版)
警告
在 Sublime Text 3.0(版本 3084)中,添加了一种新的语法定义格式,扩展名为 .sublime-syntax
。
强烈建议使用这种新格式,而不是本文档中描述的旧格式,除非需要与旧版本或使用这种格式的其他编辑器兼容。
有关详细信息,请参阅 官方文档。
本文档描述了从 TextMate 继承的旧 .tmLanguage
格式。
文件格式
TextMate 语法定义是扩展名为 .tmLanguage
的 Plist 文件。但是,为了方便起见,本参考文档中显示的是 YAML。
此外,Sublime Text 还支持 .hidden-tmLanguage
扩展名,用户无法选择,只能由插件设置。 "在文件中查找" 使用了这种扩展名。缺点是,这些文件不能通过导入语句包含在其他语言定义中。
---
# {{ $frontmatter.title }}
name: Sublime Snippet (Raw)
scopeName: source.ssraw
fileTypes: [ssraw]
uuid: 0da65be4-5aac-4b6f-8071-1aadb970b8d9
patterns:
- comment: Tab stops like $1, $2...
name: keyword.other.ssraw
match: \$\d+
- comment: Variables like $PARAM1, $TM_SELECTION...
name: keyword.other.ssraw
match: \$([A-Za-z][A-Za-z0-9_]+)
captures:
'1': {name: constant.numeric.ssraw}
- name: variable.complex.ssraw
begin: '(\$)(\{)([0-9]+):'
beginCaptures:
'1': {name: keyword.other.ssraw}
'3': {name: constant.numeric.ssraw}
end: \}
patterns:
- include: $self
- name: support.other.ssraw
match: .
- name: constant.character.escape.ssraw
match: \\[$<>]
- name: invalid.illegal.ssraw
match: '[$<>]'
name
: 语法定义的描述性名称。显示在 Sublime Text 界面右下角的语法定义下拉菜单中。通常是编程语言或等效语言的名称。
scopeName
: 此语法定义的顶层范围的名称。可以是 source.<lang>
或 text.<lang>
。对于编程语言使用 source
,对于标记语言和其他所有内容使用 text
。
fileTypes
: 这是一个文件扩展名列表(不带开头的点)。当打开这些类型的文件时,Sublime Text 会自动为它们激活此语法定义。可选。
uuid
: 此语法定义的唯一标识符。目前忽略。
patterns
: 与缓冲区文本匹配的 模式 数组。
repository
: 从 patterns
元素中抽象出来的模式数组。有助于保持语法定义整洁,以及用于递归模式或重复使用相同模式等特殊用途。可选。
模式数组
模式是以下格式之一的映射
match : 包含以下元素
元素 | 描述 |
---|---|
match | 要搜索的模式。 |
name | 可选。要分配给 match 匹配项的范围名称。 |
comment | 可选。仅供参考。 |
captures | 可选。对 match 的细化。见下文。 |
反过来,captures
可以包含以下 n 对元素(注意 0
指的是整个匹配项)
捕获 | 描述 |
---|---|
0 ..n | 引用的组的名称。必须是字符串。 |
name | 要分配给该组的范围。 |
示例
# Simple
- comment: Sequences like \$, \> and \<
name: constant.character.escape.ssraw
match: \\[$<>]
# With captures
- comment: Tab stops like $1, $2...
name: keyword.other.ssraw
match: \$(\d+)
captures:
'1': {name: constant.numeric.ssraw}
include : 从仓库中包含一个项目,另一个语法定义或当前语法定义。
引用
包含 | 描述 |
---|---|
$self | 当前语法定义。 |
#itemName | 仓库中的 itemName。 |
source.js | 外部语法定义。 |
示例
# Requires presence of DoubleQuotedStrings element in the repository.
- include: '#DoubleQuotedStrings'
# Recursively includes the complete current syntax definition.
- include: $self
# Includes and external syntax definition.
- include: source.js
begin..end : 定义一个可能跨越多行的范围。包含以下元素(仅 begin
和 end
是必需的)
范围 | 描述 |
---|---|
name | 包含标记的内容的范围名称。 |
contentName | 不包含标记的内容的范围名称。 |
begin | 开始标记模式。 |
end | 结束标记模式。 |
name | 整个区域的范围名称。 |
beginCaptures | begin 的 captures 。参见 captures 。 |
endCaptures | end 的 captures 。参见 captures 。 |
patterns | 要与内容匹配的模式数组。 |
示例
name: variable.complex.ssraw
begin: '(\$)(\{)([0-9]+):'
beginCaptures:
'1': {name: keyword.other.ssraw}
'3': {name: constant.numeric.ssraw}
end: \}
patterns:
- include: $self
- name: support.other.ssraw
match: .
仓库
仓库定义了可以通过 include
模式从 模式数组(全局或在 begin..end 模式内)引用的项目。
仓库项目可以是单个模式或模式数组。
示例
repository:
numericConstant:
patterns:
- name: constant.numeric.double.powershell
match: \d*(?<!\.)(\.)\d+(d)?(mb|kb|gb)?
captures:
'1': {name: support.constant.powershell}
'2': {name: support.constant.powershell}
'3': {name: keyword.other.powershell}
- name: constant.numeric.powershell
match: (?<!\w)\d+(d)?(mb|kb|gb)?(?!\w)
captures:
'1': {name: support.constant.powershell}
'2': {name: keyword.other.powershell}
scriptblock:
name: meta.scriptblock.powershell
begin: \{
end: \}
patterns:
- include: $self
转义序列
确保根据需要转义 JSON/XML 序列。
对于 YAML,此外还要确保您没有通过不使用引号来意外地开始新的标量。无法正常工作的示例
match: [aeiou]
include: #this-is-actually-a-comment
match: "#"\w+"" # contains double quotation marks
在这些情况下使用单引号
match: '[aeiou]'
include: '#this-is-actually-a-comment'
match: '#"\w+'