Visual Studio Codeでサポートされている言語/文法を拡張する方法はありますか?カスタム言語構文を追加したいのですが、言語サービスがどのように提供されるかについての情報を見つけることができませんでした。
誰でも参照や既存の言語実装の例を指すことができますか?
新しいバージョン0.9.0で可能です。カスタム言語の追加方法に関する公式ドキュメントがあります: https://github.com/Microsoft/vscode-docs/blob/0.9.0/release-notes/latest.md
追加する言語の.tmLanguage
ファイルが必要です。既存のファイルを見つけることができます。 GitHubで、または独自の言語ファイルを定義できます。作成方法については、こちらをご覧ください: http://manual.macromates.com/en/language_grammars
.tmLanguage
ファイルを見つけたら、それに基づいて拡張機能を作成する2つの方法があります。
オプション1:Yeomanジェネレーターを使用する
npm install -g yo
を実行してyoをインストールします(まだ行っていない場合)npm install -g generator-code
yo code
を実行し、New language support
を選択します.tmLangauge
ファイルを定義し、プラグイン名、ファイル拡張子などを定義します)オプション2:自分でディレクトリを作成する
mylang
と呼ぶことにしましょう。syntaxes
を追加し、その中に.tmlanguage
ファイルを配置しますこのようなコンテンツを含む拡張フォルダーのルート内にpackage.json
ファイルを作成します
{
"name": "mylang",
"version": "0.0.1",
"engines": {
"vscode": ">=0.9.0-pre.1"
},
"publisher": "me",
"contributes": {
"languages": [{
"id": "mylang",
"aliases": ["MyLang", "mylang"],
"extensions": [".mylang",".myl"]
}],
"grammars": [{
"language": "mylang",
"scopeName": "source.mylang",
"path": "./syntaxes/mylang.tmLanguage"
}]
}
}
最後に拡張機能をVisual Studio Codeに追加します
拡張フォルダを拡張ディレクトリにコピーします。これは:
onWindows%USERPROFILE%\.vscode\extensions
onMac/Linux$HOME/.vscode/extensions
再起動コード。これで、指定したファイル拡張子を持つファイルを開くたびに、拡張子が自動的に実行されます。使用されているプラグインの名前は、右下隅に表示されます。拡張機能の名前をクリックして変更できます。特定のファイル拡張子に対して登録されている拡張子があなたの拡張子だけでない場合、コードは間違った拡張子を選択する可能性があります。
リバースエンジニアリングを使用すると、VSCodeに新しい言語を追加できます。 TypeScriptがJavaScriptプラグインとしてどのように実装され、パイプを介してnode.exeと通信する方法を確認できます。しかし、それはすべてドキュメントなしでやってくるので難しいことです。ここでは本当に短いドキュメントを提供します。
プラグインフォルダーC:\Users\USER\AppData\Local\Code\app-0.3.0\resources\app\plugins
で新しいプラグインを定義できます。
TypeScriptプラグインフォルダーをコピーし、すべてのファイルに記載されているファイル拡張子と言語名を新しい言語に変更して、.mylangファイルを開いたときに新しいプラグインが使用されるようにします。
typescriptServiceClient.js
で、子プロセスがフォークされており、そのstdout
がnew WireProtocol.Reader
に結合されていることがわかります。独自のmylanguage.exe
をバインドします(おそらく、このexeを自分で記述する必要があります)。 VSCodeは、そのバイナリに言語固有の情報を取得するように要求します。
typescriptMain.js
には、言語の機能登録があります。 monaco.Modes.XXXXXXSupport.register
を除くmonaco.Modes.DeclarationSupport.register
へのすべての呼び出しを削除します。
ここで、.mylangファイルを含むVSCodeのディレクトリを開き、CTRL+P + FileName
を介してファイルの1つを開きます。識別子を右クリックして、Go to Definition
を選択します。 VSCodeは、StdInを介してexeにこのようなリクエストを送信します
{"seq":1,"type":"request","command":"definition","arguments":{"file":"d:/Projects/MyProj/Source/MyFile.mylang","line":45,"offset":9}}
VSCodeは、次のような答えを期待しています。
Content-Length: 251
[LINE BREAK]
{ "seq" : 1, "type" : "response", "command" : "definition", "request_seq" : 1, "success" : true, "body" : [{ "file" : "d:/Projects/MyProj/Source/MyOtherFile.mylang", "start" : { "line" : 125, "offset" : 3 }, "end" : { "line" : 145, "offset" : 11} }] }
すべてが機能する場合、VSCodeはMyOtherFile.mylangを開き、カーソルを列3の行124に設定します。
自分で試してみてください;-)
Wosiの.tmLanguage
answer を拡張するには、.tmLanguage
ファイルの使用はオプションです。通常の.json
を使用することは完全に有効であり、私の意見では、より読みやすい代替手段です。
例については、VSCode_SQFを参照してください。 sqf.json
package.json
内では、パスを./syntaxes/mylang.tmLanguage
から./syntaxes/mylang.json
に変更するだけで済みます。