Existe-t-il un moyen d'étendre les langues/grammaires prises en charge dans Visual Studio Code? Je voudrais ajouter une syntaxe de langue personnalisée, mais je n'ai pas pu trouver d'informations sur la façon dont les services linguistiques sont fournis.
Quelqu'un peut-il indiquer des références ou même des exemples d'implémentations de langage existantes?
C'est possible avec la nouvelle version 0.9.0. Il existe une documentation officielle sur la façon d'ajouter une langue personnalisée: https://github.com/Microsoft/vscode-docs/blob/0.9.0/release-notes/latest.md
Tu as besoin d'un .tmLanguage
fichier pour la langue que vous souhaitez ajouter. Vous pouvez trouver des fichiers existants, par exemple sur GitHub ou vous pouvez définir votre propre fichier de langue. Regardez ici pour avoir une idée de la façon d'en créer un: http://manual.macromates.com/en/language_grammars
Après avoir trouvé un .tmLanguage
fichier, vous avez deux façons de créer une extension à partir de celle-ci.
Option 1: utilisation d'un générateur Yeoman
npm install -g yo
npm install -g generator-code
yo code
et sélectionnez New language support
.tmLangauge
fichier, définir le nom du plugin, les extensions de fichier, etc.)Option 2: Créez le répertoire par vous-même
mylang
.syntaxes
et placez le .tmlanguage
fichier à l'intérieurCréez un fichier package.json
à l'intérieur de la racine du dossier d'extension avec un contenu comme celui-ci
{
"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"
}]
}
}
Enfin, ajoutez votre extension au code Visual Studio
Copiez le dossier d'extension dans le répertoire d'extension. C'est:
sur Windows %USERPROFILE%\.vscode\extensions
sur Mac/Linux $HOME/.vscode/extensions
Redémarrez le code. Maintenant, votre extension s'exécutera automatiquement chaque fois que vous ouvrirez un fichier avec l'extension de fichier spécifiée. Vous pouvez voir le nom du plugin utilisé dans le coin inférieur droit. Vous pouvez le modifier en cliquant sur le nom de l'extension. Si votre extension n'est pas la seule enregistrée pour une extension de fichier spécifique, alors Code peut choisir la mauvaise.
En utilisant l'ingénierie inverse, vous pouvez ajouter une nouvelle langue à VSCode. Vous pouvez voir comment TypeScript est implémenté en tant que plug-in JavaScript et comment il communique avec node.exe via un canal. Mais c'est une chose difficile car cela vient sans documentation, je vais fournir une documentation très courte ici:
Vous pouvez définir un nouveau plugin dans le dossier plugins C:\Users\USER\AppData\Local\Code\app-0.3.0\resources\app\plugins
.
Copiez le dossier du plug-in TypeScript et renommez les extensions de fichier et les noms de langue mentionnés dans tous les fichiers dans votre nouvelle langue, afin que votre nouveau plug-in soit utilisé lors de l'ouverture d'un fichier .mylang.
Dans typescriptServiceClient.js
vous voyez qu'un processus enfant est en cours de fork et que son stdout
est couplé à un new WireProtocol.Reader
. Liez votre propre mylanguage.exe
(vous aurez probablement besoin d'écrire cet exe par vous-même). VSCode demande ce binaire pour obtenir des informations plus spécifiques à la langue.
Dans typescriptMain.js
vous trouvez l'enregistrement de fonction pour la langue. Supprimer chaque appel à monaco.Modes.XXXXXXSupport.register
sauf monaco.Modes.DeclarationSupport.register
.
Ouvrez maintenant un répertoire dans VSCode qui contient des fichiers .mylang et ouvrez l'un d'eux via CTRL+P + FileName
. Faites un clic droit sur un identifiant et sélectionnez Go to Definition
. VSCode envoie maintenant une demande comme celle-ci via StdIn à votre exe
{"seq":1,"type":"request","command":"definition","arguments":{"file":"d:/Projects/MyProj/Source/MyFile.mylang","line":45,"offset":9}}
VSCode attend une réponse comme celle-ci:
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} }] }
Si tout fonctionne, VSCode ouvrira MyOtherFile.mylang et placera le curseur sur la ligne 124 dans la colonne 3.
Essayez-le par vous-même ;-)
Pour étendre Wosi's .tmLanguage
réponse , en utilisant un .tmLanguage
le fichier est facultatif. En utilisant un .json
est une alternative parfaitement valable et, à mon avis, plus lisible.
Pour un exemple, voir VSCode_SQF: sqf.json
À l'intérieur de package.json
, il vous suffirait de changer le chemin de ./syntaxes/mylang.tmLanguage
à ./syntaxes/mylang.json
.