0

私の vscode 拡張機能 tmLanguage は、明示的に JavaScript 用に構築されたものではありませんが、最良の使用例を示しているため、例として使用します。次の例を見てください。

 1  function {
 2     var p = 9;
 3 
 4     function do() {
 5       console.log(p);
 6     } 
 7
 8     var expr = function() {
 9        console.log(p);
10     }
11
12     var cons = new Function('\tconsole.log(p);');
13
14     var arrow = () => { console.log(p); }
15  }
16
17  function 
18  {
19     console.log('hello world');
20
21     return 'hello world';
22  }

私の目標は、行 #1 を開始トークンとして、行 #15 を終了トークンとして、行 #2-14 を関数本体トークンとしてキャプチャすることです。行番号 17 ~ 22 についてそれぞれ繰り返します。私の関数の開始行は空白に固有のものではなく、ユーザーの裁量により改行される可能性があることに注意してください。

私はアンカーを使用するなど、さまざまな方法を試し\Gましたが、次の文法例が最も近いものです。ただし、最初に見つかった閉じ括弧の後}、または上記の例の 6 行目で停止します。15行目でキャプチャを終了させたい

functions:
  patterns:
    - begin: (?:^|\s)(function)\s+
      beginCaptures: 
        '1' : { name: meta.tag.function-name  }
      end : (?<=(\}))
      endCaptures: 
        '1' : { name: entity.punctuation.definition.end }
      patterns:
        - begin: \{
          beginCaptures:
            '1' : { name: entity.punctuation.definition.start }
          end : \}
          patterns:
            - begin: \s*
              end : "[^\\}]*"
              name: meta.tag.function-body

私の例では yaml を使用していますが、vscode で動作する使い慣れたものであれば問題ありません


編集Gama11 のフィードバックに基づいて、私はそれを機能させることができました。基本的に、プロセスの最も重要な部分は再帰です。したがって、基本的には何も変更せず、{}ペアを見つけるための再帰的な正規表現を追加しました。これが実際の例です:

patterns:
  - begin: (?:^|\s)(function)\s+
    beginCaptures: 
      '1' : { name: meta.tag.function-name  }
    end : (?<=\})
    patterns:
      - begin : \{
        beginCaptures: 
          '0' : { name: entity.punctuation.definition.start }
        end : \}
        endCaptures: 
          '0' : { name: entity.punctuation.definition.end }
        contentName: meta.tag.function-body
        patterns :
          - include : '#parens'
repository:
  parens: 
    - patterns:
      - begin :  \{
        end : \}
        patterns: 
          - include : '#parens'
4

0 に答える 0