在Sublime Text中设置我自己的语法

时间:2014-09-05 15:33:00

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

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

>Title
>>Subtitle
>>>Comment

> Title
>> ...

>表示制表符

的位置

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

1 个答案:

答案 0 :(得分:5)

使用.tmLanguage syntax definitions执行语法突出显示。它们采用Apple的基于XML的PLIST格式进行格式化,但是由于出色的Sublime插件PackageDev,它们可以用JSON或YAML编写,我选择它的紧凑性,以及我得到的事实使用我的主题 *

突出显示的语法

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

  1. 将以单个标签开头的行匹配为"标题"线
  2. 匹配以两个标签开头的行"字幕"线
  3. 将以三个标签开头的行匹配为"评论"线。
  4. 其他所有内容都将由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复制到其中。选择 Packages ,然后将此新文件保存为Preferences -> Browse Packages...,找到Packages/User/Reminders.tmLanguage目录(确保L中的tmLanguage大写)。现在应该有一个&#34;用户 - &gt;提醒&#34; Sublime右下方语言列表中的选项,或 View -> Syntax 菜单选项。


    然而,还有一件事要做 - 着色。为此,您需要修改.tmTheme配色方案文件。由于您使用的是Sublime Text 2(我假设),因此非常简单。打开 Preferences -> Settings-User 并检查"color_scheme"的值。选择 File -> Open... 打开配色方案文件,导航到之前使用 Packages 找到的Preferences -> Browse 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属性(&#34; 粗体&#34;和&#34; italic &#34;是唯一的工作价值)但是你喜欢。


    还有一件事,如果你还记得 - 设置Sublime只在提醒视图中使用标签。使用JSON语法创建新文件,或者如果您使用&#34; Sublime Settings&#34;安装了PackageDev。句法。添加以下内容:

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

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


    那就是它!您可能需要重新启动Sublime才能启动更改,但随后您将全部设置完毕。回顾一下,制作新语法定义的步骤如下:

    1. 获取JSON,您的生活将变得更轻松。
    2. 使用PackageDev正则表达式语言以JSON或YAML格式编写突出显示正则表达式,使用Oniguruma等工具在线测试(使用Ruby 1.9.2选项)。
    3. 编译为PLIST / XML。
    4. 修改新范围的配色方案。
    5. 为标签等特定于语法的设置创建.sublime-settings文件。
    6. ???
    7. 利润!

    8. 如果您有兴趣,

      *会链接到我的用户个人资料中