跳至内容

语法定义(旧版)

警告

在 Sublime Text 3.0(版本 3084)中,添加了一种新的语法定义格式,扩展名为 .sublime-syntax

强烈建议使用这种新格式,而不是本文档中描述的旧格式,除非需要与旧版本或使用这种格式的其他编辑器兼容。

有关详细信息,请参阅 官方文档

本文档描述了从 TextMate 继承的旧 .tmLanguage 格式。

文件格式

TextMate 语法定义是扩展名为 .tmLanguage 的 Plist 文件。但是,为了方便起见,本参考文档中显示的是 YAML。

此外,Sublime Text 还支持 .hidden-tmLanguage 扩展名,用户无法选择,只能由插件设置。 "在文件中查找" 使用了这种扩展名。缺点是,这些文件不能通过导入语句包含在其他语言定义中。

yaml
---

# {{ $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要分配给该组的范围。

示例

yaml
# 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外部语法定义。

示例

yaml
# 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 : 定义一个可能跨越多行的范围。包含以下元素(仅 beginend 是必需的)

范围描述
name包含标记的内容的范围名称。
contentName不包含标记的内容的范围名称。
begin开始标记模式。
end结束标记模式。
name整个区域的范围名称。
beginCapturesbegincaptures。参见 captures
endCapturesendcaptures。参见 captures
patterns要与内容匹配的模式数组。

示例

yaml
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 模式内)引用的项目。

仓库项目可以是单个模式或模式数组。

示例

yaml
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,此外还要确保您没有通过不使用引号来意外地开始新的标量。无法正常工作的示例

yaml
match: [aeiou]

include: #this-is-actually-a-comment

match: "#"\w+"" # contains double quotation marks

在这些情况下使用单引号

yaml
match: '[aeiou]'

include: '#this-is-actually-a-comment'

match: '#"\w+'