sublime文本语法高亮插件 - 着色函数名称

时间:2015-11-15 18:58:22

标签: sublimetext2 syntax-highlighting textmate

我正在尝试制作一个崇高的文本插件,用于语法高亮一种名为" e验证语言的编程语言": 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"是类型,"是& #34;是一个语法关键字,":"如果存在,也应该着色。

我尝试使用"捕获"在插件tmLanguage文件中阻止。成功着色函数名称,但因为""正在识别该行?最后,两者之间的所有内容都没有突出显示。 我正在捕捉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>

我用我的捕获块(蓝色功能名称)添加功能照片,没有(白色名称,绿色&#34; int&#34;和&#34;真实&#34;)。有什么方法可以结合起来,以便所有需要的东西都会被着色吗?

谢谢。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

您需要使用repository

嵌套语法高亮显示

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

  1. 创建适合您语法的.YAML-tmLanguage语法文件
  2. 以下是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文件
    2. 安装PackageDev后,您现在可以将其转换为PLIST语法(Ctrl + Shift + P&gt; YAML到PLIST)并将其保存在myc.tmLanguage下。

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

        以下是使用块中的调用和您请求的函数结构func(int&lt; ...&gt;,int&lt; ...&gt;)的示例test.myc文件:

        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(验证语言)...