VSCodeのSyntax開発のやり方をちゃんと知る
2日で実装したってやべえなsta.icon
Developer: Inspect Editor Tokens and Scopesでなんかデバッグできるらしい、へーsta.icon
そしてデバッグしやすくするために、BNF的に構造的につくっといた方が良いらしい
1を精読した後、2を読んでみよう
見た感じ、BNF記法みたいな感じで定義してる、のかこれ?sta.icon ---
腰が落ちかけてる。たかが拡張機能の文法ごときでこんなに勉強せなあかんのって気持ち……
が、覚えれば今後VSCodeもっと便利になるし、頑張ろう……
---
理解したsta.icon
2:
正規表現は行単位でのマッチしかしない(複数行にマッチする正規表現は書けない)みたいなことが書いてあります。鬼車自体は複数行のマッチに対応していますが、 TextMate側の都合で行単位のマッチしかできないようになっています。
アンカーの一つ
\b は単語の先頭または単語の末尾にマッチします。逆に \B は単語の先頭および末尾以外にマッチします。
複数行マッチはbegin endで頑張れ
挙動は以下だと推測されている
begin, endは、おそらく
begin にマッチしなかったら失敗させる
テキストを1行ずつ見ていって、 patterns の中にマッチする規則があればその規則を適用する
end にマッチしたらマッチングを終わる
というような動作をします。 違ったらすみません。
適切な名前をつけると、あとはVSCodeがいい感じにハイライトしてくれます。
この人は名前はConventionに従うことにしたのねsta.icon
F5でデバッグできるの知らなかったsta.icon*3
1:
以下和文引用はDeepL.icon
テキストのトークン化とは、テキストをセグメントに分割し、各セグメントをトークンタイプで分類することです。
そうか、やっぱり分割なのかsta.icon
Sematic Hilight
言語サーバーを使うやつ
たとえば定数Cを、定義部分以外の使用箇所でもハイライトできたりする
よーわからん。今は関係ないので飛ばすsta.icon
TextMate grammars rely on Oniguruma regular expressions
鬼車という正規表現エンジンをつかっているらしいよ? テーマは、スコープを色やスタイルにマップして、構文の強調表示を行います。TextMateは、多くのテーマが対象とする共通のスコープをリストアップしています。文法をできるだけ広くサポートするために、新しいスコープを定義するのではなく、既存のスコープをベースにするようにしましょう。
すいません、tritaskでも新スコープ路線で行ってますわ……sta.icon
スコープを入れ子にすることで、各トークンが親スコープのリストとも関連付けられます。以下の例では、スコープインスペクタを使って、単純な JavaScript 関数の + 演算子のスコープ階層を表示しています。最も特殊なスコープが一番上に表示され、その下に一般的な親スコープが表示されています。
https://gyazo.com/708c64386daea13b70a1aba2a3d3054f
ソース
関数
ブロック
リテラル
オペレーターの+
文法ファイル自体はトップレベルのルールで構成されています。これは通常、プログラムのトップレベル要素をリストアップするパターンセクションと、各要素を定義するリポジトリに分かれています。
ああ、patternsってトップレベルの要素だけ列挙するものなのかsta.icon
abc言語の例見てるけど、うん、BNFだわ、というかトークナイズっていうのかsta.icon
Embedded languages
たとえばHTMLの中でCSS書いたときに、その部分はCSSとしてハイライトさせたいよねって話
このスコープだったらこの言語の定義使え、という指定ができる
既存のtextmateからも変換できる?
yo codeは、既存のTextMateの文法をVS Codeの拡張機能に変換することもできます。ここでもyo codeを起動し、Language extensionを選択します。既存の文法ファイルを聞かれたら、.tmLanguageか.jsonのTextMate文法ファイルへのフルパスを与えます。
としたら、実はTextMate?で文法つくってからそれを変換した方が早いんじゃね?sta.icon ダメやった。トークン書かせる感じやった
jsonでも書けるがyamlでも書ける
行並べてコメント入れたりとかもできるのでjsonより楽
ただし
VS Codeはjsonの文法しか読み込めないので、yamlベースの文法はjsonに変換する必要があります。js-yamlパッケージとコマンドラインツールがこれを簡単にします。
js-yamlを使って.tmLanguage.yamlを.tmLanguage.jsonに変換すればいいsta.icon
Injection grammars
インジェクション文法の応用例
コメント中のTODOのようなキーワードを強調する。
既存の文法に、より具体的なスコープ情報を追加する。
Markdownのフェンスで囲まれたコードブロックに新しい言語用のハイライトを追加する。
が、むずそうなんでスキップsta.icon
Theming
色付け
これはわかるからいい