Hey !
J'essaye depuis hier de créer une petite extension pour Visual Studio Code de façon à pouvoir faire une coloration syntaxique pour les commandes du jeu Minecraft.
Pour cela, je me suis pas mal renseigné sur l'API officiel que l'on peut trouver ici et sur celle de TextMate sur lequel se base le système de VSCode.
J'ai réussi à créer le plugin et à l'utiliser, mais je bloque sur le ormat TextMate.
Je n'arrive pas à faire en sorte qu'une règle en suive une autre, je m'explique :
Sur le jeu, il y a une commande qui est grossièrement de cette forme-ci :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
gamemode (adventure|creative|survival|spectator) ((@a|@e)(\[.*\])?)?
où le deuxième argument n'est disponible que lorsqu'il suit le mot "gamemode" et le troisième que lorsqu'il suit le deuxième.
Pour cela, j'ai créer pour syntaxe (j'ai retiré ce qui n'était pas utile, dont le troisième argument) :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
	"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
    "name": "Minecraft Command Syntax Helper",
    "scopeName": "source.csh",
	"patterns": [
		{ "include": "#gamemode" }
	],
	"repository": {
		"gamemode": {
			"begin": "^gamemode\\b",
			"beginCaptures": {"0": { "name": "command.root.gamemode.csh"}},
			"end": "$",
			"patterns": [
				{ "include": "#modes" },
				{ "include": "#selector" }
			]
        },
 
		"modes": {
			"name": "constant.modes.csh",
			"match": "\\badventure\\b|\\bcreative\\b|\\bsurvival\\b|\\bspectator\\b"
		}
    }
}


Avec pour coloration :
Code :Sélectionner tout -Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
{
	"tokenColors": [
		{
			"name": "Root Commands",
			"scope": "command.root",
			"settings": {
				"fontStyle": "",
				"foreground": "#1e56ff"
			}
		},
 
		{
			"name": "Gamemodes",
			"scope": "constant.modes.csh",
			"settings": {
				"fontStyle": "",
				"foreground": "#cc00cc"
			}
		},
 
		{
			"name": "Selector",
			"scope": "selector.selector.csh",
			"settings": {
				"fontStyle": "",
				"foreground": "#ff9137"
			}
		},
 
		{
			"name": "Error",
			"scope": "error.csh",
			"settings": {
				"fontStyle": "",
				"foreground": "#ff0000"
			}
		}],
	"name": "Command Syntax Helper"
}

Et voici ce que j'ai pour résultat :



Comme on peut le voir dans la deuxième commande, le "survival" qui suit le "creative" ne fait pas partie de ma syntaxe mais est tout de même coloré, ou encore le deuxième "creative" de troisième commande.
Je ne comprends donc pas comment on doit faire suivre les règles pour dire "celle-ci ne survient que suite à celle-là", j'ai l'impression que le "pattern" n'est en fait qu'une "pool" dans lequel il pioche les règles à appliquer sans prendre en compte un éventuel ordre.

Je voudrais aussi savoir s'il est possible de faire un cas d'erreur pour que la deuxième commande voit le "survival" coloré en rouge par exemple pour dire que cela ne respecte pas la syntaxe (je pensais pouvoir le faire par le begin/end, mais apparemment non).

En espérant pouvoir trouver des éclaircissements ici !
Merci d'avance de votre aide !

P.S. Voici le projet au complet pour ceux qui veulent voir plus en détails/tester l'extension :