私の 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'