【问题标题】:sublime text syntax highlight plugin - coloring function namesublime text syntax highlight 插件 - 着色函数名称
【发布时间】:2016-02-16 20:36:02
【问题描述】:

我正在尝试为一种名为“e 验证语言”的编程语言的语法高亮制作 sublime 文本插件: https://en.wikipedia.org/wiki/E_%28verification_language%29

该语言的函数定义:

function_name (name_1: type_1, name_2: type_2, ...) : return_type is { function body }

例如:

function_name(num1: int, num2: real) : int is { ...

输入参数和返回值是可选的。

没有输入参数,没有返回值,两者都没有:

function_name() : int is { ...
function_name(num1: int, num2: real) is { ...
function_name() is { ...

我想给函数名上色,如果需要的话,保持行中的其余关键字也上色(“int”和“real”是类型,“is”是语法关键字,“:”也应该上色如果存在)。

我尝试在插件 tmLanguage 文件中使用“捕获”块。成功的着色函数名称,但由于该行被末尾的“is”识别,因此中间的所有内容都不会突出显示。 我在一行中捕获了 4 件事:函数名、“(”、“)”、“是”

使用的代码:

        <dict>
            <key>captures</key>
            <dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>entity.name.function</string>
                </dict>
                <key>2</key>
                <dict>
                    <key>name</key>
                    <string>keyword.language</string>
                </dict>
                <key>3</key>
                <dict>
                    <key>name</key>
                    <string>keyword.language</string>
                </dict>
                <key>4</key>
                <dict>
                    <key>name</key>
                    <string>keyword.language</string>
                </dict>
            </dict>
            <key>match</key>
            <string>^\s*(\b[^\s]+)\s*(\()\s*.*\s*(\))\s*:*\s*.*\s+(is)\b</string>
        </dict>

我添加了带有我的捕获块(蓝色函数名称)和没有(白色名称,绿色“int”和“real”)的函数照片。有什么方法可以组合,让所有需要的东西都上色吗?

谢谢。

【问题讨论】:

    标签: sublimetext2 syntax-highlighting textmate


    【解决方案1】:

    您需要使用repository嵌套语法高亮显示

    我鼓励您使用 .YAML-tmLanguage 文件(更易于阅读),您可以使用 PackageDev 轻松将其转换为 .tmLanguage

    1. 创建适合您的语法的 .YAML-tmLanguage 语法文件

    这是 C 语言的剥离文件(在 Packages/User 中将其命名为 myc.YAML-tmLanguage):

    fileTypes: [myc, myh]
    scopeName: source.myc
    name: myc
    
    patterns:
      - match: \b(for|if)\b
        name: keyword.control.c
    
      - match: \b(int)\b
        name: storage.type.c
    
      - include: '#block'
    
      - begin: "(?x)\n    \t\t(?:  ^                                 # begin-of-line\n \
          \   \t\t  |\n    \t\t     (?: (?= \\s )           (?<!else|new|return) (?<=\\\
          w)      #  or word + space before name\n    \t\t       | (?= \\s*[A-Za-z_] ) (?<!&&)\
          \       (?<=[*&>])   #  or type modifier before name\n    \t\t     )\n    \t\t\
          )\n    \t\t(\\s*) (?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\\\
          s*\\()\n    \t\t(\n    \t\t\t(?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ |          \
          \        # actual name\n    \t\t\t(?: (?<=operator) (?: [-*&<>=+!]+ | \\(\\) |\
          \ \\[\\] ) )  # if it is a C++ operator\n    \t\t)\n    \t\t \\s*(?=\\()"
        beginCaptures:
          '1':
            name: punctuation.whitespace.function.leading.c
          '3':
            name: entity.name.function.c
          '4':
            name: punctuation.definition.parameters.c
        end: (?<=\})|(?=#)|(;)
        name: meta.function.c
        patterns:
        - include: '#parens'
        - include: '#block'
    
    repository:
      block:
        begin: \{
        end: \}
        name: meta.block.c
        patterns:
        - include: '#block_innards'
    
      parens:
        begin: \(
        end: \)
        name: meta.parens.c
        patterns:
        - include: $self
    
      block_innards:
        patterns:
        - include: '#block'
        - include: $self
    
        - captures:
            '1':
              name: punctuation.whitespace.function-call.leading.c
            '2':
              name: support.function.any-method.c
            '3':
              name: punctuation.definition.parameters.c
          match: "(?x) (?: (?= \\s )  (?:(?<=else|new|return) | (?<!\\w)) (\\s+))?\n\t\
            \t\t(\\b\n\t\t\t\t(?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\\\
            s*\\()(?:(?!NS)[A-Za-z_][A-Za-z0-9_]*+\\b | :: )++                  # actual\
            \ name\n\t\t\t)\n\t\t\t \\s*(\\()"
          name: meta.function-call.c
    
    1. 将其转换为 .tmLanguage 文件

    安装 PackageDev 后,您现在可以将其转换为 PLIST 语法(Ctrl+Shift+P > YAML 到 PLIST)并将其保存在 myc.tmLanguage 下。

    1. 在 Sublime Text 中测试语法高亮

    这是一个示例 test.myc 文件,使用块中的调用和您请求的函数结构 func(int <...>, int <...>):

    int prime(int n, int n);
    int main()
    {
        for(i=2; i<=n/2; ++i)
        {
            if (prime(i)!=0)
            {
                test(int k, int n);
                if ( prime(n-i)!=0)
                {
                    printf("%d = %d + %d\n", n, i, n-i);
                    flag=1;
                }
            }
        }
    }
    

    这里有syntax highlighting in ST3。希望你可以让它为 e(验证语言)工作......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2013-05-08
      • 2016-12-08
      • 2015-11-20
      相关资源
      最近更新 更多