作用域命名

Sublime Text 中的语法定义和配色方案通过使用作用域名称进行交互。作用域是点分隔的字符串,从最不具体到最具体指定。例如,PHP 中的 if 关键字可以通过作用域名称 keyword.control.php 指定。

Sublime Text 支持 TextMate 语言语法,并从各种开源包继承了其默认语法。该 TextMate 语言语法文档 提供了一组基本的作用域名称,这些名称已由社区逐步扩展和更改。

这是一份动态文档,旨在记录在语法定义和配色方案中使用作用域名称的最佳实践。所有 Sublime Text 默认包都努力遵守这些建议。

语法定义🔗

下面记录的作用域是创建语法定义时建议使用的一组基本作用域名称。

在本文档中,语法名称从点分隔的作用域名称的末尾省略。在编写语法时,除非另有说明,否则语法名称应是点分隔名称的最后一个部分。例如,Ruby 中的控制关键字将是 keyword.control.ruby,而在 Python 中将是 keyword.control.python

示例语法🔗

改进和扩展 Sublime Text 附带的默认语法是一个持续的过程。截至 2019 年初,以下语法最近进行了重新设计,可以作为参考

字母顺序参考🔗

以下顶级作用域列表按字母顺序排序。建议在编写或修改语法之前至少通读一遍整个列表。

comment.🔗

单行和多行注释应分别使用

  • comment.line

  • comment.block

用作文档的多行注释,例如 Javadoc 或 PhpDoc,应使用

  • comment.block.documentation

分隔注释的符号,例如 ///*,应另外使用

  • punctuation.definition.comment

具有特殊语法以指示代码部分的注释应仅在文本上使用以下作用域。这将导致它在符号列表中显示。

  • meta.toc-list

constant.🔗

数字文字,包括整数、浮点数等,应使用以下之一

  • constant.numeric

  • constant.numeric.integer

  • constant.numeric.integer.binary

  • constant.numeric.integer.octal

  • constant.numeric.integer.decimal

  • constant.numeric.integer.hexadecimal

  • constant.numeric.integer.other

  • constant.numeric.float

  • constant.numeric.float.binary

  • constant.numeric.float.octal

  • constant.numeric.float.decimal

  • constant.numeric.float.hexadecimal

  • constant.numeric.float.other

  • constant.numeric.complex

  • constant.numeric.complex.real

  • constant.numeric.complex.imaginary

内置于语言中的常量,例如布尔值和空值,应使用

  • constant.language

字符串中的字符转义,例如 \n\x20,应使用

  • constant.character.escape

格式占位符,例如用于 sprintf() 的占位符,例如 %s,应使用

  • constant.other.placeholder

其他特定于语言的常量值,例如 Ruby 中的符号,应使用

  • constant.other

entity.🔗

实体范围通常分配给代码和标记中数据结构、类型和其他唯一可识别构造的名称。值得注意的例外是 entity.name.tagentity.other.attribute-name,它们用于 HTML 和 XML 标签。

数据结构的名称将使用以下范围之一,或 entity.name 的新子范围 - 此列表并不详尽。为了提供丰富的语义信息,请使用给定语言构造的特定术语。

避免使用 entity.name.type.classentity.name.type.struct,它们在 type 下不必要地嵌套范围标签。

  • entity.name.class

  • entity.name.struct

  • entity.name.enum

  • entity.name.union

  • entity.name.trait

  • entity.name.interface

  • entity.name.impl

  • entity.name.type

forward-decl 的变体用于 C 和 C++ 等语言。此类范围可用于从符号列表和索引中排除标识符。

  • entity.name.class.forward-decl

作为继承类或实现接口/特征列出的类、接口和特征名称应使用

  • entity.other.inherited-class

函数名称接收以下范围之一。这些包含在符号列表和索引中。

  • entity.name.function

  • entity.name.function.constructor

  • entity.name.function.destructor

命名空间、包和模块使用以下范围。通常一种语言中不会有多种类型的此类构造,因此此范围就足够了。

  • entity.name.namespace

常量应使用以下范围或 variable.other.constant,具体取决于语言语义。此范围通常包含在符号列表和索引中。

  • entity.name.constant

goto 类构造的标签应使用

  • entity.name.label

标记语言(如 Markdown 和 Textile)中的标题名称应使用

  • entity.name.section

HTML 和 XML 标签应使用以下范围。这是唯一应用于重复构造的 entity.name 范围。

  • entity.name.tag

HTML、CSS 和 XML 对标签属性名称使用以下内容

  • entity.other.attribute-name

invalid.🔗

在特定上下文中非法的元素应使用以下范围。过度使用此范围可能会导致用户在编辑代码时出现不愉快的突出显示。

  • invalid.illegal

已弃用的元素应使用以下范围进行范围限定。这应该非常少见,因为用户可能正在使用旧版本的语言。

  • invalid.deprecated

keyword.🔗

控制关键字示例包括 iftryendwhile。某些语法更喜欢用 conditional 变体标记 ifelse。在适当的情况下,import 变体通常使用。

  • keyword.control

  • keyword.control.conditional

  • keyword.control.import

包含标点符号的关键字(例如 CSS 中的 @ 符号)将以下范围添加到符号中

  • punctuation.definition.keyword

所有剩余的非运算符关键字都属于 other 变体

  • keyword.other

运算符通常是符号,因此术语 keyword 有点矛盾。有时会根据运算符的类型引用特定的变体。

  • keyword.operator

  • keyword.operator.assignment

  • keyword.operator.arithmetic

  • keyword.operator.bitwise

  • keyword.operator.logical

当运算符是单词时,例如 andornot,使用以下变体

  • keyword.operator.word

markup.🔗

标记范围用于内容,而不是代码。这包括 Markdown 和 Textile 等语法。

节标题应使用

  • markup.heading

列表应使用以下之一

  • markup.list.unnumbered

  • markup.list.numbered

基本文本样式应使用以下之一

  • markup.bold

  • markup.italic

  • markup.underline

插入和删除的内容,例如使用 diff 输出,应使用

  • markup.inserted

  • markup.deleted

链接应使用

  • markup.underline.link

块引用和其他引用样式应使用

  • markup.quote

内联和块文字引用,通常用于代码,应使用

  • markup.raw.inline

  • markup.raw.block

其他标记,包括脚注和表格等结构,应使用

  • markup.other

meta.🔗

元范围用于对代码或标记的较大部分进行范围限定,通常包含多个更具体的范围。这些不打算通过配色方案进行样式化,而是由首选项和插件使用。

数据结构的完整内容应使用以下范围之一进行范围限定。类似于 entity.name,它们应该根据语言进行自定义以提供丰富的语义信息。它们应该包括所有元素,例如名称、继承详细信息和主体。

  • meta.class

  • meta.struct

  • meta.enum

  • meta.union

  • meta.trait

  • meta.interface

  • meta.impl

  • meta.type

函数的整个范围应由以下范围之一覆盖。每个变体都应应用于特定部分,而不是堆叠。例如,meta.function.php meta.function.parameters.php 永远不会出现,而是范围应该在 meta.function.phpmeta.function.parameters.php 之间交替,然后返回到 meta.function.php

  • meta.function

  • meta.function.parameters

  • meta.function.return-type

命名空间、模块或包的全部内容应使用

  • meta.namespace

C 等语言中的预处理器语句应使用

  • meta.preprocessor

用于修改类、方法或函数的行为或实现的注释、属性和装饰器语句应使用以下 meta 范围之一来表示注释的每个组件。也就是说,在任何给定时间,堆栈上永远不会有多个 meta.annotation* 范围。有关标识符范围限定,请参阅 variable.annotation

  • meta.annotation

  • meta.annotation.identifier

  • meta.annotation.parameters

  • punctuation.definition.annotation

完整的标识符,包括命名空间名称,应使用以下范围。此类标识符是变量、函数和类名称的完全限定形式。例如,在 C++ 中,路径可能类似于 myns::myclass,而在 PHP 中,它将显示为 \MyNS\MyClass

  • meta.path

函数名称,包括完整路径和所有参数,应接收以下范围。函数或方法的名称应为 variable.function,除非函数的范围限定为 support.function

  • meta.function-call

用花括号分隔的代码段应使用以下 meta 范围之一,具体取决于语义。 {} 字符还应使用 punctuation 范围。

  • meta.block

  • punctuation.section.block.begin

  • punctuation.section.block.end

  • meta.braces

  • punctuation.section.braces.begin

  • punctuation.section.braces.end

用圆括号分隔的代码段应使用以下 meta 范围之一,具体取决于语义。 () 字符还应使用 punctuation 范围。

  • meta.group

  • punctuation.section.group.begin

  • punctuation.section.group.end

  • meta.parens

  • punctuation.section.parens.begin

  • punctuation.section.parens.end

用方括号分隔的代码段应使用以下范围。 [] 字符还应使用 punctuation 范围。

  • meta.brackets

  • punctuation.section.brackets.begin

  • punctuation.section.brackets.end

通用数据类型构造应使用以下范围。 任何表示开始和结束的符号,例如 <>,还应使用 punctuation 范围。

  • meta.generic

  • punctuation.definition.generic.begin

  • punctuation.definition.generic.end

HTML 和 XML 标签,包括标点符号、名称和属性,应使用以下

  • meta.tag

标记语言中的段落使用

  • meta.paragraph

punctuation.🔗

以下范围是未嵌入其他范围内的标点符号范围。 例如,string. 部分包含有关字符串标点符号范围的文档。

分隔符,如逗号和冒号,应使用

  • punctuation.separator

分号或其他语句终止符应使用

  • punctuation.terminator

行延续字符,例如 Python 和 R 中的字符,应使用

  • punctuation.separator.continuation

成员访问、范围解析或类似构造应使用以下范围。 对于 Python 或 JavaScript,这将是 .。 在 PHP 中,这将应用于 ->::。 在 C++ 中,这将应用于所有三个。

  • punctuation.accessor

source.🔗

以下范围的特定于语言的变体通常应用于源代码文件的全部内容

  • source

storage.🔗

类型应使用以下范围。 例子包括 intboolchar

  • storage.type

影响变量、函数或数据结构存储的关键字应使用以下范围。 例子包括 staticinlineconstpublicprivate

  • storage.modifier

函数或方法的关键字应使用以下范围。 示例关键字包括 funcfunctiondef这包括 storage.type 以与旧的颜色方案保持向后兼容。

  • storage.type.function keyword.declaration.function

类、结构体、接口等的关键字应使用以下范围 - 此列表并不详尽。示例关键字包括 classstructimpltypedef这包括 storage.type,为了与旧的颜色方案保持向后兼容。

  • storage.type.class keyword.declaration.class

  • storage.type.struct keyword.declaration.struct

  • storage.type.enum keyword.declaration.enum

  • storage.type.union keyword.declaration.union

  • storage.type.trait keyword.declaration.trait

  • storage.type.interface keyword.declaration.interface

  • storage.type.impl keyword.declaration.impl

  • storage.type keyword.declaration.type

string.🔗

基本字符串使用以下范围之一,根据使用的引号类型

  • string.quoted.single

  • string.quoted.double

  • string.quoted.triple

使用非常规引号的字符串,例如 <> 与 C 导入一起使用,应使用

  • string.quoted.other

整个字符串,以及所有标点符号、前缀、后缀和插值,应使用

  • meta.string

字符串开头和结尾的标点符号应使用

  • punctuation.definition.string.begin

  • punctuation.definition.string.end

未加引号的字符串,例如在 Shell 和批处理文件中,应使用

  • string.unquoted

正则表达式文字应使用

  • string.regexp

当字符串包含插值代码时,例如变量或表达式,string.* 范围应使用 clear_scopes: 删除,并且以下内容应添加到整个插值中,包括标点符号

  • meta.interpolation

插值表达式的标点符号应为

  • punctuation.section.interpolation.begin

  • punctuation.section.interpolation.end

在标点符号之间,插值表达式应获得

  • source.*language-suffix*.embedded

support.🔗

由基本框架提供的元素应使用以下范围之一。例如,Objective-C 中的 Cocoa,或 JavaScript 中的浏览器/Node。

  • support.constant

  • support.function

  • support.module

虽然也用于基本框架,但许多语法将这些应用于无法识别的类和类型的范围,有效地对所有用户构造进行范围限定。

  • support.type

  • support.class

text.🔗

编程语言使用 source. 作为其基本范围,而内容使用 text.。最大的区别之一是,许多插件和其他动态功能在 text. 范围内被禁用。 markup. 范围通常在文本中使用。

HTML 应使用以下范围。此范围的变体不同于其他范围,因为变体始终添加到 .html 之后,例如 text.html.basictext.html.markdown

  • text.html

XML 应使用

  • text.xml

variable.🔗

通用变量应使用以下范围。某些语言使用 readwrite 变体来对比下面讨论的 constant 变体。

  • variable.other

  • variable.other.readwrite

作为变量名称一部分的符号,应另外应用以下范围。例如,PHP 和 Shell 中的 $

  • punctuation.definition.variable

不可变变量,通常通过 const 修饰符,应该使用以下范围。根据语言和语义,entity.name.constant 可能是一个更好的选择。

  • variable.other.constant

语言指定的保留变量名,例如 thisselfsuper 等,应该使用

  • variable.language

函数或方法的参数应该使用以下范围。这也可以用于其他类似参数的变量,例如 Go 中的接收器或命名返回值。

  • variable.parameter

类或其他数据结构的字段、属性、成员和属性应该使用

  • variable.other.member

函数和方法名应该使用以下范围,但仅在调用时使用。在定义时,它们应该使用 entity.name.function

  • variable.function

注释中标识符的最后一个标签应该使用以下范围。对于整个标识符,应该使用 meta.path 范围。整个注释应该使用 meta.annotation

  • variable.annotation

用于分隔注释的引导符号应该使用

  • punctuation.definition.annotation

配色方案🔗

一般来说,在配色方案中将颜色和样式应用于范围时,应该首先设置选择器的最通用形式。利用上一节中概述的范围的高质量语法将为最终用户带来良好的用户体验。

最小范围覆盖🔗

以下是一组推荐的最小范围,用于突出显示。添加额外的范围可能会带来略微改善的体验,但是过于具体会导致配色方案经常只对一两种语法看起来很好。

  • entity.name

  • entity.other.inherited-class

  • entity.name.section

  • entity.name.tag

  • entity.other.attribute-name

  • variable

  • variable.language

  • variable.parameter

  • variable.function

  • constant

  • constant.numeric

  • constant.language

  • constant.character.escape

  • storage.type

  • storage.modifier

  • support

  • keyword

  • keyword.control

  • keyword.operator

  • keyword.declaration

  • string

  • comment

  • invalid

  • invalid.deprecated

meta. 颜色🔗

在设置范围样式时,请抵制直接设置 meta 范围的冲动。它们主要用于为首选项和插件提供上下文信息。

entity.name. 颜色🔗

从历史上看,许多配色方案都为 entity.name.functionentity.name.type 提供了一种颜色,并且通常为 entity.name.tag 提供了一种不同的颜色。这会导致新的 entity.name.* 范围没有突出显示。

配色方案应该改为为 entity.name 指定一种颜色,该颜色将应用于类、类型、结构体、接口和许多其他数据结构。可以为 entity.name.tagentity.name.section 这两个范围覆盖此颜色,这两个范围用于不同类型的结构。