【问题标题】:Set my own syntax in Sublime Text在 Sublime Text 中设置我自己的语法
【发布时间】:2014-10-30 14:42:49
【问题描述】:

有时我使用 Sublime Text 来编写提醒。 我总是为这个任务使用相同的布局,如下所示:

>Title
>>Subtitle
>>>Comment

> Title
>> ...

> 代表制表符

所以我想知道是否可以为这类文件创建自己的语法突出显示,标题用一种颜色,副标题用另一种颜色,注释用常规颜色。

【问题讨论】:

  • 是的,有可能。

标签: sublimetext2 syntax-highlighting sublimetext sublime-text-plugin


【解决方案1】:

使用.tmLanguagesyntax definitions 执行语法高亮显示。它们被格式化为 Apple 基于 XML 的 PLIST 格式,尽管由于出色的 Sublime 插件PackageDev 它们可以用 JSON 或 YAML 编写,我选择它是因为它的紧凑性,而且我使用它可以获得甜美的语法突出显示我的主题*.

因此,您的语法非常简单。您将拥有三个规则:

  1. 以单个制表符开头的匹配行作为“标题”行
  2. 以两个制表符开头的匹配行作为“字幕”行
  3. 匹配以三个制表符开头的行作为“注释”行。

Sublime 将以纯文本形式显示其他所有内容。


在这里,在 YAML 中:

# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Reminders
comment: Written for http://stackoverflow.com/q/25689365/1426065 by @MattDMo
scopeName: text.reminders
fileTypes: [todo]
uuid: 6B548E74-5E01-497A-B030-9D31131B7A70

patterns:
- name: text.title.reminders
  match: ^\t(?!\t+)(.*)

- name: text.subtitle.reminders
  match: ^\t\t(?!\t+)(.*)

- name: text.comment.reminders
  match: ^\t\t\t(.*)

一切都很简单。这个名字是出现在 Sublime 右下角的,它是我写的,它的基本作用域名称是text.reminders,打开一个带有.todo 扩展名的文件会自动应用这个语法,而 UUID 只是一个唯一标识符。正如我上面提到的,有三种模式。需要记住的一件事:仅当行以文字制表符开头时才匹配,而不是作为制表符插入的空格字符!这意味着您需要选择 View -> Indentation 并确保 Indent Using Spaces选中。为了更好地衡量,也请选择 View -> Indentation -> Convert Indentation to Tabs。这些设置可以仅应用于“提醒”视图,我稍后会介绍。


所以我们有我们的 YAML,如果你没有 PackageDev,它就毫无用处。但是,翻译成 PLIST 效果会更好:

<?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>comment</key>
    <string>Written for http://stackoverflow.com/q/25689365/1426065 by @MattDMo</string>
    <key>fileTypes</key>
    <array>
        <string>todo</string>
    </array>
    <key>name</key>
    <string>Reminders</string>
    <key>patterns</key>
    <array>
        <dict>
            <key>match</key>
            <string>^\t(?!\t+)(.*)</string>
            <key>name</key>
            <string>text.title.reminders</string>
        </dict>
        <dict>
            <key>match</key>
            <string>^\t\t(?!\t+)(.*)</string>
            <key>name</key>
            <string>text.subtitle.reminders</string>
        </dict>
        <dict>
            <key>match</key>
            <string>^\t\t\t(.*)</string>
            <key>name</key>
            <string>text.comment.reminders</string>
        </dict>
    </array>
    <key>scopeName</key>
    <string>text.reminders</string>
    <key>uuid</key>
    <string>6B548E74-5E01-497A-B030-9D31131B7A70</string>
</dict>
</plist>

在 Sublime 中,使用 XML 语法创建一个新文件,并将上述 XML 复制到其中。通过选择 Preferences -&gt; Browse Packages... 找到您的Packages 目录,然后将这个新文件保存为Packages/User/Reminders.tmLanguage(确保tmLanguage 中的L 大写)。现在在 Sublime 右下角的语言列表中应该有一个“用户 -> 提醒”选项,或者通过 View -&gt; Syntax 菜单选项。


但是,还有一件事要做 - 上色。为此,您需要修改 .tmTheme 配色方案文件。由于您使用的是 Sublime Text 2(我假设),这很容易。打开Preferences -&gt; Settings-User,查看"color_scheme"的值。通过选择 File -&gt; Open... 打开配色方案文件,导航到您之前使用 Preferences -&gt; Browse Packages... 找到的 Packages 目录,然后在它所在的任何子目录中打开该文件。例如,如果您的设置文件显示"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",您将导航到打开文件对话框中的Packages/Color Scheme - Default 目录并打开Monokai.tmTheme。超级简单。

现在您已经打开了配色方案文件,您可以根据需要将语法设置为 XML,然后一直向下滚动到底部。你会想要插入你的新颜色(我会在一分钟内完成)上面写着:

    </array>
    <key>uuid</key>
    <string>06CD1FB2-A00A-4F8C-97B2-60E131912345</string>
</dict>
</plist>

UUID 甚至可能不存在,它可能只是说:

    </array>
</dict>
</plist>

无论如何,应该始终是文件中的最后一行,否则会中断。无论如何,在这些行之上,插入以下字典:

    <dict>
        <key>name</key>
        <string>Reminders - Title</string>
        <key>scope</key>
        <string>text.reminders text.title.reminders</string>
        <key>settings</key>
        <dict>
            <key>fontStyle</key>
            <string>bold italic</string>
            <key>foreground</key>
            <string>#00FF00</string>
            <key>background</key>
            <string></string>
        </dict>
    </dict>
    <dict>
        <key>name</key>
        <string>Reminders - Subtitle</string>
        <key>scope</key>
        <string>text.reminders text.subtitle.reminders</string>
        <key>settings</key>
        <dict>
            <key>fontStyle</key>
            <string></string>
            <key>foreground</key>
            <string>#FF0080</string>
            <key>background</key>
            <string></string>
        </dict>
    </dict>
    <dict>
        <key>name</key>
        <string>Reminders - Comment</string>
        <key>scope</key>
        <string>text.reminders text.comment.reminders</string>
        <key>settings</key>
        <dict>
            <key>fontStyle</key>
            <string></string>
            <key>foreground</key>
            <string></string>
            <key>background</key>
            <string></string>
        </dict>
    </dict>

随意自定义foregroundbackground 颜色和fontStyle 属性(“bold”和“italic”是唯一有效的值)随你喜欢。


如果您还记得的话,还有一件事 - 将 Sublime 设置为仅在 提醒 视图中使用选项卡。使用 JSON 语法创建一个新文件,或者如果您安装了 PackageDev,则使用“Sublime Settings”语法。添加以下内容:

{
    "translate_tabs_to_spaces": false,
    "extensions": 
    [
        "todo"
    ]
}

(是的,我知道“todo”已经在语言定义中,我只是为了安全起见)。您可以在此处添加 Preferences -&gt; Settings-Default... -&gt; Settings-User 文件中使用的任何其他选项,只需确保该文件是有效的 JSON。将文件另存为Packages/User/Reminders.sublime-settings


就是这样!您可能需要重新启动 Sublime 才能使更改生效,但随后一切就绪。回顾一下,创建新语法定义的步骤如下:

  1. 联系PackageDev,你的生活会轻松很多。
  2. 使用 Oniguruma 正则表达式语言以 JSON 或 YAML 格式编写突出显示正则表达式,使用 Rubular 等工具在线测试(使用 Ruby 1.9.2 选项)。
  3. 编译为 PLIST/XML。
  4. 修改新范围的配色方案。
  5. 为制表符等特定语法设置创建一个.sublime-settings 文件。
  6. ???
  7. 利润!

* 如果您有兴趣,请在我的用户资料中链接...

【讨论】:

  • 这非常有帮助——如果您能看看我最近提出的类似问题,我将不胜感激。
  • @MattDMo 这样做只会为该特定文件添加一些颜色吗? OP提到使用制表符,有没有办法设置它,所以如果一个句子以一个字符开头,比如#或//,它会改变颜色?
  • @vytfla 是的,您所要做的就是调整正则表达式以匹配 #// 或任何您想要的。
  • @MattDMo 好的,谢谢。所以我相信我正确地添加了所有内容。我刚刚所做的一切如何知道我想将它与当前文件相关联?我尝试在我的文件中使用标签,但它不起作用。另外,我不熟悉正则表达式,我将如何为我想要的那些字符自定义它?
猜你喜欢
  • 2015-08-26
  • 2015-12-21
  • 2018-09-21
  • 2013-10-26
  • 2014-04-09
  • 2016-04-13
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多