📜  方案 tmLanguage - 方案(1)

📅  最后修改于: 2023-12-03 15:26:14.895000             🧑  作者: Mango

方案 tmLanguage - 方案

方案tmLanguage是一种文本编辑器代码高亮语法的文件格式,它是Sublime Text、TextMate和VS Code等流行代码编辑器使用的标准之一。它是使用XML语法描述的,可以定义关键字、注释、字符串、正则表达式、行注释、块注释、标点符号等各种编程语言中常见的构造。

构成

一个方案tmLanguage文件通常由下面几个部分组成

1. 全局设置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
  <dict>
    <key>name</key>
    <string>MyLanguage</string>
    <key>scopeName</key>
    <string>source.mylanguage</string>
    <key>fileTypes</key>
    <array>
      <string>ml</string>
    </array>
    <key>uuid</key>
    <string>6D94E1B7-37F9-452F-9EB9-2EE071ECE8EB</string>
  </dict>
</plist>

全局设置由一个字典组成,需要指定方案的名称、范围名称、支持的文件类型和UUID等必要信息。

2. 语法定义
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
  <dict>
    <key>name</key>
    <string>MyLanguage</string>
    <key>scopeName</key>
    <string>source.mylanguage</string>
    <key>fileTypes</key>
    <array>
      <string>ml</string>
    </array>
    <key>uuid</key>
    <string>6D94E1B7-37F9-452F-9EB9-2EE071ECE8EB</string>
    <key>patterns</key>
    <array>
        <!-- 定义注释 -->
        <dict>
            <key>name</key>
            <string>comment.line.mylanguage</string>
            <key>match</key>
            <string>//.*</string>
        </dict>
        <!-- 定义关键字 -->
        <dict>
            <key>name</key>
            <string>keyword.control.mylanguage</string>
            <key>match</key>
            <string>\b(if|else|for|while|do|break)\b</string>
        </dict>
        <!-- 定义字符串 -->
        <dict>
            <key>name</key>
            <string>string.quoted.double.mylanguage</string>
            <key>begin</key>
            <string>"</string>
            <key>end</key>
            <string>"</string>
        </dict>
    </array>
  </dict>
</plist>

语法定义是方案中最重要的部分,其中包含了各种单词、符号和注释等的语法定义。在这个例子中,我们用了正则表达式来匹配和标识出数字和关键字。我们定义了注释、关键字和字符串三种类型的标记。每个标记由一个字典定义,并指定了其名称、开始和结束符号以及正则表达式等属性。

3. 颜色定义
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
  <dict>
    <key>name</key>
    <string>MyLanguage</string>
    <key>scopeName</key>
    <string>source.mylanguage</string>
    <key>fileTypes</key>
    <array>
      <string>ml</string>
    </array>
    <key>uuid</key>
    <string>6D94E1B7-37F9-452F-9EB9-2EE071ECE8EB</string>
    <key>patterns</key>
    <array>
        <!-- 定义注释 -->
        <dict>
            <key>name</key>
            <string>comment.line.mylanguage</string>
            <key>match</key>
            <string>//.*</string>
            <key>captures</key>
            <dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.comment.mylanguage</string>
                </dict>
            </dict>
        </dict>
        <!-- 定义关键字 -->
        <dict>
            <key>name</key>
            <string>keyword.control.mylanguage</string>
            <key>match</key>
            <string>\b(if|else|for|while|do|break)\b</string>
            <key>captures</key>
            <dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>keyword.control.mylanguage</string>
                </dict>
            </dict>
        </dict>
        <!-- 定义字符串 -->
        <dict>
            <key>name</key>
            <string>string.quoted.double.mylanguage</string>
            <key>begin</key>
            <string>"</string>
            <key>end</key>
            <string>"</string>
            <key>captures</key>
            <dict>
                <key>0</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.begin.mylanguage</string>
                </dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>string.quoted.double.mylanguage</string>
                </dict>
                <key>2</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.end.mylanguage</string>
                </dict>
            </dict>
        </dict>
    </array>
    <key>uuid</key>
    <string>9D45A68F-5347-4C73-88AB-2B3B3C4AE4E4</string>
    <key>uuid</key>
    <string>6D94E1B7-37F9-452F-9EB9-2EE071ECE8EB</string>
    <key>name</key>
    <string>MyLanguage</string>
    <key>scopeName</key>
    <string>source.mylanguage</string>
    <key>fileTypes</key>
    <array>
      <string>ml</string>
    </array>
    <key>patterns</key>
    <array>
      <dict>
        <key>name</key>
        <string>meta.embedded.block.html</string>
        <key>begin</key>
        <string>^</string>
        <key>end</key>
        <string>$</string>
        <key>patterns</key>
        <array>
          <dict>
            <key>include</key>
            <string>text.html.basic</string>
          </dict>
        </array>
      </dict>
    </array>
  </dict>
</plist>

颜色定义指定了在编辑器中使用的颜色和字体信息等,可以让代码更好的视觉效果。它也由一个字典定义,并在其中指定了用于显示各项标记的字体和颜色等属性。在这个例子中,我们使用上一节中定义的注释、关键字和字符串三种类型的标记,并设置了它们的颜色和字体。

总结

方案tmLanguage是一个用于定义文本编辑器代码高亮的文件格式,它是使用XML语法描述的,可以定义关键字、注释、字符串、正则表达式等构造。Sublime Text、TextMate、VS Code等流行的代码编辑器都支持使用方案tmLanguage格式定义语法高亮。方案tmLanguage文件通常由全局设置、语法定义和颜色定义三部分组成。它们一起工作,使得代码编辑器可以更好地辨别和高亮语言中各种关键字和标记,提高了编程效率和代码可读性。