Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
prog:vsc:module_highlight [2021/02/06 19:48] – Ajout de "Coloration personnalisée" root | prog:vsc:module_highlight [2021/02/26 13:22] (Version actuelle) – Ajout de "Utilisation d'un langage existant" root |
---|
| |
Chaque ''repository'' contient un dictionnaire de pattern. | Chaque ''repository'' contient un dictionnaire de pattern. |
| |
| * ''match'' |
| |
Il est possible de ne définir que le pattern avec son type de contenu. Ici, on repère 4 mots clés (''if'', ''while'', ''for'', ''return''). | Il est possible de ne définir que le pattern avec son type de contenu. Ici, on repère 4 mots clés (''if'', ''while'', ''for'', ''return''). |
}, | }, |
</code> | </code> |
| |
| * ''begin'' et ''end'' |
| |
Dans l'autre exemple ci-dessous, le symbole ''%%"%%'' et ''%%"%%'' désigne le début (''begin'') et la fin (''end'') d'un texte. Là où l'utilisation de ''match'' se limite à une seule ligne, ''begin'' et ''end'' peut être sur une ou plusieurs lignes. Ce texte aura comme coloration syntaxique ''string.quoted.double''. | Dans l'autre exemple ci-dessous, le symbole ''%%"%%'' et ''%%"%%'' désigne le début (''begin'') et la fin (''end'') d'un texte. Là où l'utilisation de ''match'' se limite à une seule ligne, ''begin'' et ''end'' peut être sur une ou plusieurs lignes. Ce texte aura comme coloration syntaxique ''string.quoted.double''. |
| |
Il y a aussi un double intérêt. Si le caractère d'échappement ''%%\"%%'' apparait, le guillement sera considéré comme un pattern et ne pourra pas être considéré par la contrainte ''end''. Textmate lisant de gauche à droite et le pattern commençant un caratère avant, ''patterns'' sera prioritaire au ''end''. Par contre, si ''patterns'' et ''end'' commencent au même caratère, c'est ''end'' qui sera prioritaire. | Il y a aussi un double intérêt. Si le caractère d'échappement ''%%\"%%'' apparait, le guillement sera considéré comme un pattern et ne pourra pas être considéré par la contrainte ''end''. Textmate lisant de gauche à droite et le pattern commençant un caratère avant, ''patterns'' sera prioritaire au ''end''. Par contre, si ''patterns'' et ''end'' commencent au même caratère, c'est ''end'' qui sera prioritaire. |
| |
| |
<code javascript> | <code javascript> |
| |
Il est aussi possible d'utiliser ''beginCaptures'' et ''endCaptures'' sur les textes correspondant aux expressions régulières de ''begin'' et ''end''. | Il est aussi possible d'utiliser ''beginCaptures'' et ''endCaptures'' sur les textes correspondant aux expressions régulières de ''begin'' et ''end''. |
| |
| En plus de ''name'', il existe ''contentName''. Si on applique ''name'' à un pattern, il s'appliquera au texte désigné par ''begin'', ''end'' et le texte au milieu. Par contre, ''contentName'' ne va définir le nom que pour le texte entre les textes désignés par ''begin'' et ''end''. Si les deux sont appliqués, c'est le nom définit par ''contentName'' qui sera prioritaire. |
| |
| Il est aussi possible d'utiliser ''begin'' et ''end'' et de réutiliser leurs contenus dans ''pattern'' via les [[lang:regex#|Positive and Negative Lookahead]]. |
| |
| <WRAP center round important 60%> |
| Le pattern de récursion ne fonctionnera plus. |
| </WRAP> |
| |
| |
| <code javascript> |
| "identifiant": { |
| "begin": "(?=^\\s*(if)\\s)", |
| "end": "(?<=^\\s*end_if\\s*$)", |
| "name": "meta.if.definition.cellman.TRAN", |
| "pattern": [...] |
| }, |
| </code> |
| |
| |
====Bonnes pratiques==== | ====Bonnes pratiques==== |
156 | 156 |
</file>|Version colorée : \\ \\ {{:prog:vsc:module_highlight:hl_example_1.png?200|}}| | </file>|Version colorée : \\ \\ {{:prog:vsc:module_highlight:hl_example_1.png?200|}}| |
| |
| ====Utilisation d'un langage existant==== |
| Une partie du code peut intégrer un langage existant. |
| |
| Il faut définir qu'on va s'injecter dans le ''scopeName'' dans ''package.json''. |
| |
| <code javascript> |
| { |
| "language": "cellman_stave", |
| "scopeName": "source.cellman.stave", |
| "path": "./syntaxes/cellman.tmLanguage.stave.json" |
| }, |
| { |
| "scopeName": "shell.injection", |
| "path": "./syntaxes/shellscriptInjection.tmGrammar.json", |
| "injectTo": [ |
| "source.cellman.stave" |
| ], |
| "embeddedLanguages": { |
| "meta.embedded.shellscript": "shellscript" |
| } |
| } |
| </code> |
| |
| <file javascript shellscriptInjection.tmGrammar.json> |
| { |
| "scopeName": "shell.injection", |
| "injectionSelector": "R:meta.embedded.shellscript", |
| "patterns": [ |
| { |
| "include": "source.shell" |
| } |
| ] |
| } |
| </file> |
| |
| Utilisation du langage importé. Il faut impérativement utiliser ''begin'', ''end'' et ''contentName'' qui sont multiligne. |
| |
| Pour être utiliser en single line, on peut tricher... |
| |
| <code javascript> |
| { |
| "begin": ".", |
| "end": "$", |
| "contentName": "meta.embedded.shellscript" |
| } |
| </code> |
| |
====Coloration personnalisée==== | ====Coloration personnalisée==== |
} | } |
</code> | </code> |
| |
| ====Générer le module==== |
| |
| ===En local=== |
| |
| Il faut ajouter le champ ''publisher'' dans ''package.json'' et lancer la commande : |
| |
| <code bash> |
| vsce package |
| </code> |
| |
| Et pour installer le module dans Visual Studio Code : |
| |
| <code bash> |
| code --install-extension myextension.vsix |
| </code> |
| |