【问题标题】:Are there any standards for tmlanguage keyword types?tmlanguage 关键字类型有什么标准吗?
【发布时间】:2014-06-21 05:50:03
【问题描述】:

.tmlanguage 文件通过定义键值对列表来工作。正则表达式是键,语法类型是值。这是通过以下 XML-ish 方式完成的:

<key>match</key>
<string>[0-9]</string>
<key>name</key>
<string>constant.numeric</string>

我的主要问题是:如果文件要由像 Sublime 这样的文本编辑器使用,是否有可以代替 constant.numeric 的值列表?

【问题讨论】:

    标签: syntax sublimetext2 customization syntax-highlighting


    【解决方案1】:

    有关基本介绍,请查看 TextMate 手册的Language Grammars 部分。 Naming Conventions 部分描述了一些基本范围,例如 commentkeywordmetastorage 等。然后可以对这些类进行子类化以提供尽可能多的细节 - 例如,@987654333 @。但是,非常重要的是要注意,这些不是硬性规定——只是建议。当您浏览不同的语言定义并查看例如函数作用域的所有不同方式时,这一点会变得很明显 - meta.function-callsupport.function.namemeta.function-call punctuation.definition.parameters 等。

    了解作用域的最佳方法是检查现有的.tmLanguage 文件,并查看不同语言的源代码并查看在何处分配了哪些作用域。 XML 格式很难随便浏览,所以我使用优秀的PackageDev 插件将 XML 转换为 YAML。然后更容易扫描并查看哪些范围由哪些正则表达式描述:

    另一种学习方法是查看不同语言结构的范围,为此我强烈建议使用ScopeAlways。安装并激活后,只需放置光标,适用于该特定位置的范围就会显示在状态栏中。这在设计配色方案时特别有用,因为您可以轻松查看哪些选择器会突出显示感兴趣的语言功能。

    如果您有兴趣,这里使用的配色方案是Neon,我设计它是为了让尽可能多的语言看起来尽可能好,覆盖尽可能多的范围。随意浏览它,看看不同的语言元素是如何突出显示的;这也可以帮助您设计 .tmLanguage 以与其他语言保持一致。

    我希望这一切都会有所帮助,祝你好运!

    【讨论】:

    • 除了ScopeAlways,还有Scope Hunter
    • @Hibou57 我没有提到Scope Hunter的原因是你每次想看范围都需要触发它,而ScopeAlways会在当前光标位置连续显示范围。
    • 我不知道以前的版本,但是在当前版本中,命令面板中有一个“Scope Hunter:Toggle Instant Scoper”,它始终在输出中显示范围面板。
    • @Hibou57 这很有趣,我不知道。
    【解决方案2】:

    是的。 .tmlanguage 格式最初由 TextMate 使用。 TextMate manual 提供了格式的完整文档,包括可能的语言结构类型。

    the relevant docs page复制,分层格式:

    • comment 用于 cmets。
      • line 行 cmets,我们进一步专门化,以便可以从范围中提取注释开始字符的类型
        • double-slash // 评论
        • double-dash -- 评论
        • number-sign # 评论
        • percentage % 评论
        • character 其他类型的线路 cmets。
      • block 多行 cmets,例如 /* … */&lt;!-- … --&gt;
        • documentation 嵌入式文档。
    • constant 各种形式的常量。
      • numeric 代表数字的那些,例如421.3f0x4AB1U
      • character 代表字符的那些,例如&amp;lt;\e\031
      • escape 转义序列如\e 将是constant.character.escape
      • language 语言提供的常量(通常)是“特殊”的,例如truefalsenilYESNO 等。
      • other 其他常量,例如CSS 中的颜色。
    • entity 实体指的是文档的较大部分,例如章节、类、函数或标签。我们不会将整个实体限定为entity.*(我们为此使用meta.*)。但我们确实使用entity.* 表示较大实体中的“占位符”,例如如果实体是章节,我们将使用entity.name.section 作为章节标题。
      • name 我们正在命名更大的实体。
        • function函数的名称。
        • type类型声明或类的名称。
        • tag标签名称。
        • section名称是部分/标题的名称。
      • other 其他实体。
        • inherited-class超类/基类名称。
        • attribute-name 属性的名称(主要在标签中)。 我们正在命名更大的实体。
    • invalid “无效”的东西。
      • illegal 非法,例如HTML 中的与号或小于号字符(不是实体/标签的一部分)。
      • deprecated 表示已弃用的内容,例如使用已弃用的 API 函数或使用带有严格 HTML 的样式。
    • keyword 关键字(当这些关键字不属于其他组时)。
      • control主要与流程控制相关,如继续、同时、返回等。
      • operator 运算符可以是文本(例如或)或字符。
      • other 其他关键字。
    • markup 这适用于标记语言,通常适用于较大的文本子集。
      • underline 带下划线的文本。
        • link——这是用于链接的,为了方便起见,它源自markup.underline,因此如果没有专门针对markup.underline.link的主题规则,那么它将继承下划线样式。李>
      • bold 粗体文本(strong 和类似的文本最好源自此名称)。
      • heading 节标题。可选择提供标题级别作为下一个元素,例如,markup.heading.2.html 表示 HTML 中的 &lt;h2&gt;…&lt;/h2&gt;
      • italic 斜体文本(emphasized 和类似的文本最好源自此名称)。
      • list 列出项目。
        • numbered 编号的列表项。
        • unnumbered 未编号的列表项。
      • quote 引用(有时是块引用)文本。
      • raw 逐字逐句的文本,例如代码清单。 markup.raw 通常会禁用拼写检查。
      • other 其他标记结构。
    • meta 元范围通常用于标记文档的较大部分。例如,声明函数的整行是meta.function,子集是storage.typeentity.name.functionvariable.parameter 等,只有后者会被样式化。有时,范围的元部分仅用于限制样式化的更通用元素,但大多数情况下元范围用于范围选择器中以激活捆绑项目。例如,在 Objective-C 中,类的接口声明和实现有一个元作用域,允许相同的选项卡触发器根据上下文进行不同的扩展。
    • storage 与“存储”相关的事情。
      • type 某事物的类型,classfunctionintvar 等。
      • modifier 存储修饰符,例如 staticfinalabstract 等。
    • string 字符串。
      • quoted 引用的字符串。
        • single 单引号字符串:'foo'
        • double 双引号字符串:"foo"
        • triple 三重引号字符串:"""Python"""
        • other 其他类型的引用:$'shell'%s{...}
      • unquoted 适用于 here-docs 和 here-strings 等内容。
      • interpolated 被“评估”的字符串:`date`$(pwd)
      • regexp 正则表达式:/(\w+)/
      • other 其他类型的字符串(应该很少使用)。
    • support 框架或库提供的东西应该在支持之下。
      • function 由框架/库提供的功能。例如,Objective-C 中的 NSLogsupport.function
      • class 当框架/库提供类时。
      • type 由框架/库提供的类型,这可能仅用于从 C 派生的语言,它具有 typedef(和 struct)。大多数其他语言将引入新类型作为类。
      • constant 框架/库提供的常量(魔术值)。
      • variable 由框架/库提供的变量。例如 AppKit 中的 NSApp
      • other以上内容应该是详尽无遗的,但对于其他所有内容,请使用 support.other
    • variable 变量。并非所有语言都允许轻松识别(并因此标记)这些。
      • parameter当变量被声明为参数时。
      • language 保留语言变量,例如 thissuperself 等。
      • other 其他变量,例如 $some_variables

    【讨论】:

    • 有一个更广泛的列表,专门针对 Sublime Text,here。它包括标点名称空间。
    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2016-08-09
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多