prog:vsc:module_highlight
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| prog:vsc:module_highlight [2021/01/29 10:43] – Création avec les Prérequis root | prog:vsc:module_highlight [2021/02/26 13:22] (Version actuelle) – Ajout de "Utilisation d'un langage existant" root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====Prérequis==== | + | =====Prérequis===== |
| + | |||
| + | La documentation est [[https:// | ||
| + | |||
| + | ====Node.js==== | ||
| Il faut installer [[prog: | Il faut installer [[prog: | ||
| + | Installer les programmes '' | ||
| + | |||
| + | <code bash> | ||
| + | npm install -g yo generator-code | ||
| + | </ | ||
| + | |||
| + | =====Création du module===== | ||
| + | |||
| + | Générer le module de base pour la coloration syntaxique : | ||
| + | |||
| + | yo code | ||
| + | |||
| + | Résultat de la console : | ||
| + | |||
| + | {{: | ||
| + | |||
| + | < | ||
| + | ? ========================================================================== | ||
| + | We're constantly looking for ways to make yo better! | ||
| + | May we anonymously report usage statistics to improve the tool over time? | ||
| + | More info: https:// | ||
| + | ========================================================================== Yes | ||
| + | | ||
| + | | | ||
| + | |--(o)--| | ||
| + | | ||
| + | ( _´U`_ ) ╰──────────────────────────╯ | ||
| + | / | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | ? What type of extension do you want to create? New Language Support | ||
| + | Enter the URL (http, https) or the file path of the tmLanguage grammar or press ENTER to start with a new grammar. | ||
| + | ? URL or file to import, or none for new: | ||
| + | ? What's the name of your extension? CELLman Lang | ||
| + | ? What's the identifier of your extension? cellman-lang | ||
| + | ? What's the description of your extension? Syntax highlighting for CELLman lang | ||
| + | Enter the id of the language. The id is an identifier and is single, lower-case name such as ' | ||
| + | ? Language id: cellman | ||
| + | Enter the name of the language. The name will be shown in the VS Code editor mode selector. | ||
| + | ? Language name: CELLman | ||
| + | Enter the file extensions of the language. Use commas to separate multiple entries (e.g. .ruby, .rb) | ||
| + | ? File extensions: .cmc, .TRAN | ||
| + | Enter the root scope name of the grammar (e.g. source.ruby) | ||
| + | ? Scope names: source.cmc | ||
| + | ? Initialize a git repository? Yes | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Your extension cellman-lang has been created! | ||
| + | |||
| + | To start editing with Visual Studio Code, use the following commands: | ||
| + | |||
| + | cd cellman-lang | ||
| + | code . | ||
| + | |||
| + | Open vsc-extension-quickstart.md inside the new extension for further instructions | ||
| + | on how to modify, test and publish your extension. | ||
| + | |||
| + | For more information, | ||
| + | </ | ||
| + | |||
| + | =====Syntaxe des fichiers===== | ||
| + | |||
| + | ====package.json==== | ||
| + | |||
| + | Dans ce fichier, il faut uniquement modifier la partie '' | ||
| + | |||
| + | ===languages=== | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }], | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ===grammars=== | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }] | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Il y a deux façons : via l'id du langage ou via une extension du langage. | ||
| + | |||
| + | On peut utiliser le champ '' | ||
| + | |||
| + | Il est aussi possible d' | ||
| + | |||
| + | ====xxx.tmLanguage.json==== | ||
| + | |||
| + | Voir [[https:// | ||
| + | |||
| + | ===Arborescence de base=== | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | avec 3 champs à personnaliser : | ||
| + | |||
| + | * '' | ||
| + | |||
| + | * '' | ||
| + | |||
| + | * '' | ||
| + | |||
| + | ===pattern=== | ||
| + | |||
| + | Chaque '' | ||
| + | |||
| + | * '' | ||
| + | |||
| + | Il est possible de ne définir que le pattern avec son type de contenu. Ici, on repère 4 mots clés ('' | ||
| + | |||
| + | Le nom doit impérativement respecter la [[https:// | ||
| + | |||
| + | <code javascript> | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }] | ||
| + | }, | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | |||
| + | Dans l' | ||
| + | |||
| + | Ensuite, à l' | ||
| + | |||
| + | Il y a aussi un double intérêt. Si le caractère d' | ||
| + | |||
| + | <code javascript> | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Il est aussi possible de colorer en fonction des groupes de l' | ||
| + | |||
| + | <code javascript> | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Il est aussi possible d' | ||
| + | |||
| + | En plus de '' | ||
| + | |||
| + | Il est aussi possible d' | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Le pattern de récursion ne fonctionnera plus. | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code javascript> | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ====Bonnes pratiques==== | ||
| + | |||
| + | ===Principe=== | ||
| + | |||
| + | L' | ||
| + | |||
| + | Il est donc préférable d' | ||
| + | |||
| + | ===Exemple=== | ||
| + | |||
| + | * '' | ||
| + | |||
| + | <file javascript package.json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | } | ||
| + | ], | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | |||
| + | Le schéma à respecter est [[https:// | ||
| + | |||
| + | Il est important de comprendre le fichier '' | ||
| + | |||
| + | <file javascript lang.tmLanguage.json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | "// Le fichier contient soit des fonctions, soit du code source.": | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ], | ||
| + | "// Dans le champ repository, on stocke et nomme toutes les regex.": | ||
| + | " | ||
| + | "// Regex caractérisant un float.": | ||
| + | "// Ici, l' | ||
| + | "// Un type peut faire référence (include) à un autre type qui sera défini plus tard.": | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | "// Regex caractérisant un int.": "", | ||
| + | "// Il est important de mettre le cas le plus spécialisé en premier.": | ||
| + | "// Si on avait mis integer en premier, on n' | ||
| + | "// car les parties entière et décimale seraient détectées comme int": "", | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | "// Pour faire simple, on dit qu'un expression, c'est soit :": "", | ||
| + | "// | ||
| + | "// | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | "// On suppose que les types sont des nombres uniquement.": | ||
| + | "// Si le type est inconnu, on le déclare invalide.": | ||
| + | "// Attention à ne pas déclarer invalide comme fallthrough à chaque pattern.": | ||
| + | "// Sinon, les patterns qui include le type s' | ||
| + | "// sans lire les étapes suivantes.": | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | "// Une initialisation de variable se faire :": "", | ||
| + | "// int variable = expression;": | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | "// Un if a la syntaxe suivante :": "", | ||
| + | "// if expression then": "", | ||
| + | "// | ||
| + | "// fi": "", | ||
| + | "// La déclaration de la partie code est faite dans l' | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | "// Ici, on utilise le groupe \\1 qui fait référence au groupe 1 de begin": | ||
| + | "// Comme il n'est pas possible de détecter les fi correspondant aux if": "", | ||
| + | "// dans le cas de if imbriqués, on utilise l' | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | "// Le code représente des instructions entières.": | ||
| + | "// Ici, on considère que des nombres et expression peuvent": | ||
| + | "// être des instructions mais cela aurait pu être interdit.": | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |<file lang test.lang> | ||
| + | text not supported | ||
| + | |||
| + | 156 | ||
| + | 156.6f | ||
| + | 0x156aE | ||
| + | |||
| + | 123+456 | ||
| + | |||
| + | float eiuaf = 123; | ||
| + | |||
| + | eiua eiua = 123; | ||
| + | |||
| + | function xxx | ||
| + | double eiuad = 123.3d; | ||
| + | if 156 = 156 then | ||
| + | if 156 = 156 then | ||
| + | int eiua = 123.3d; | ||
| + | fi | ||
| + | int eiua = 123.3d; | ||
| + | fi | ||
| + | end_function | ||
| + | |||
| + | 156 | ||
| + | </ | ||
| + | |||
| + | ====Utilisation d'un langage existant==== | ||
| + | Une partie du code peut intégrer un langage existant. | ||
| + | |||
| + | Il faut définir qu'on va s' | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file javascript shellscriptInjection.tmGrammar.json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Utilisation du langage importé. Il faut impérativement utiliser '' | ||
| + | |||
| + | Pour être utiliser en single line, on peut tricher... | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====Coloration personnalisée==== | ||
| + | |||
| + | Afin d' | ||
| + | |||
| + | A défaut, il faudra définir les couleurs manuellement dans les préférences de l' | ||
| + | |||
| + | Gros inconvénient, | ||
| + | |||
| + | <code javascript> | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | "Same color than entity.name.function" | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | ] | ||
| + | }, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====Générer le module==== | ||
| + | |||
| + | ===En local=== | ||
| + | |||
| + | Il faut ajouter le champ '' | ||
| + | |||
| + | <code bash> | ||
| + | vsce package | ||
| + | </ | ||
| + | |||
| + | Et pour installer le module dans Visual Studio Code : | ||
| + | |||
| + | <code bash> | ||
| + | code --install-extension myextension.vsix | ||
| + | </ | ||
prog/vsc/module_highlight.1611913381.txt.gz · Dernière modification : de root
