.tmlanguage
个文件通过定义键值对列表来工作。正则表达式是键,语法的类型是值。这是以下列XML-ish方式完成的:
<key>match</key>
<string>[0-9]</string>
<key>name</key>
<string>constant.numeric</string>
我的主要问题是:如果文件由Sublime等文本编辑器使用,是否有可以代替constant.numeric
的值列表?
答案 0 :(得分:18)
有关基本介绍,请查看TextMate手册的Language Grammars部分。 Naming Conventions部分介绍了一些基本范围,例如comment
,keyword
,meta
,storage
等。然后可以将这些类子类化为尽可能详细 - 例如constant.numeric.integer.long.hexadecimal.python
。但是,非常重要的是要注意这些不是硬性规则 - 只是建议。当您浏览不同的语言定义时,这将变得很明显,例如,查看功能范围的所有不同方式 - meta.function-call
,support.function.name
,meta.function-call punctuation.definition.parameters
等。
了解范围的最佳方法是检查现有的.tmLanguage
文件,并查看不同语言的来源,并查看在哪里分配了范围。 XML格式很难随意浏览,因此我使用优秀的PackageDev
插件将XML转换为YAML。然后更容易扫描并查看正则表达式描述的范围:
另一种学习方法是查看不同语言结构的范围,为此我强烈建议使用ScopeAlways
。安装并激活后,只需放置光标,状态栏中将显示适用于该特定位置的范围。这在设计配色方案时特别有用,因为您可以轻松查看哪些选择器将突出显示感兴趣的语言特征。
如果你有兴趣,这里使用的配色方案是Neon,我设计的尽可能多的语言看起来尽可能好,涵盖尽可能多的范围。随意查看它,看看如何突出显示不同的语言元素;这也可以帮助您设计.tmLanguage
以与其他语言保持一致。
我希望这一切都有所帮助,祝你好运!
答案 1 :(得分:14)
是。 .tmlanguage
格式最初由TextMate使用。 TextMate manual提供了格式的完整文档,包括可能的语言结构类型。
以the relevant docs page复制,采用分层格式:
comment
- 征求意见。
line
- 行注释,我们进一步专注,以便可以从范围中提取注释开始字符的类型
double-slash
-//
评论double-dash
---
评论number-sign
-#
评论percentage
-%
评论character
- 其他类型的评论。block
- 多行评论,例如/* … */
和<!-- … -->
。
documentation
- 嵌入式文档。constant
- 各种形式的常量。
numeric
- 代表数字的那些,例如42
,1.3f
,0x4AB1U
。character
- 代表字符的内容,例如<
,\e
,\031
。escape
-\e
之类的转义序列为constant.character.escape
。language
- 常量(通常)由语言提供的“特殊”,例如true
,false
,nil
,{{ 1}},YES
等NO
- 其他常量,例如CSS中的颜色。other
- 实体是指文档的更大部分,例如章节,类,函数或标记。我们不会将整个实体的范围限定为entity
(我们使用entity.*
)。但我们确实将meta.*
用于较大实体中的“占位符”,例如如果实体是章节,我们将使用entity.*
作为章节标题。
entity.name.section
- 我们正在命名较大的实体。
name
- 函数的名称。function
- 类型声明或类的名称。type
- 标记名称。tag
- 该名称是部分/标题的名称。section
- 其他实体。
other
- 超类/基类名称。inherited-class
- 属性的名称(主要在标签中)。 我们正在命名更大的实体。attribute-name
- “无效”的内容。
invalid
- 非法,例如HTML中的&符号或低于字符(不是实体/标记的一部分)。illegal
- 对于已弃用的内容,例如使用不推荐使用的API函数或使用严格HTML的样式。deprecated
- 关键字(当这些关键字不属于其他组时)。
keyword
- 主要与流量控制相关,如continue,while,return等。control
- 运营商可以是文字(例如或)或字符。operator
- 其他关键字。other
- 这适用于标记语言,通常适用于较大的文本子集。
markup
- 带下划线的文字。
underline
- 这是针对链接的,为方便起见,这是从link
派生的,因此如果没有专门针对markup.underline
的主题规则那么它将继承下划线样式。markup.underline.link
- 粗体文字(bold
及类似文字最好应从此名称中获取)。strong
- 一个标题标题。 (可选)将标题级别作为下一个元素提供,例如HTML中heading
的{{1}}。markup.heading.2.html
- 斜体文字(<h2>…</h2>
相位相似且类似的文字最好应从此名称中获取。)italic
- 列出项目。
em
- 编号的列表项。list
- 未编号的列表项。numbered
- 引用(有时是带引号的)文字。unnumbered
- 文字是逐字的,例如代码清单。通常,quote
已禁用拼写检查。raw
- 其他标记构造。markup.raw
- 元范围通常用于标记文档的较大部分。例如,声明函数的整行将是other
,子集将是meta
,meta.function
,storage.type
等,只有后者才会被设置样式。有时,作用域的元部分将仅用于限制样式的更通用元素,但大多数情况下元作用域用于作用域选择器以激活束项。例如,在Objective-C中,有一个元范围用于类和实现的接口声明,允许相同的制表符触发器以不同的方式扩展,具体取决于上下文。entity.name.function
- 与“存储”相关的事情。
variable.parameter
- 某种类型,storage
,type
,class
,function
等。int
- 一个存储修饰符,如var
,modifier
,static
等。final
- 字符串。
abstract
- 引用字符串。
string
- 单引号字符串:quoted
。single
- 双引号字符串:'foo'
。double
- 三重引号字符串:"foo"
。triple
- 其他类型的引文:"""Python"""
,other
。$'shell'
- ,例如here-docs和here-strings。%s{...}
- 被“评估”的字符串:unquoted
,interpolated
。`date`
- 正则表达式:$(pwd)
。regexp
- 其他类型的字符串(应该很少使用)。/(\w+)/
- 框架或库提供的内容应低于支持。
- 当框架/库提供类时,
other
- 框架/库提供的功能。例如,Objective-C中的support
为function
。- 框架/库提供的
NSLog
- 。support.function
- 类型,这可能仅用于从C派生的语言,其中class
(和type
) 。大多数其他语言会将新类型作为类引入。typedef
- 框架/库提供的常量(魔术值)。struct
- 由框架/库提供的变量。例如AppKit中的constant
。variable
- 以上内容应该是详尽无遗的,但对于其他所有内容,请使用NSApp
。other
- 变量。并非所有语言都允许轻松识别(并因此标记)这些语言。当变量被声明为参数时,
support.other
- 。variable
- 保留语言变量,例如parameter
,language
,this
等。super
- 其他变量,例如self
。