turbo-editors/turbo-pythonpublic Fork 0
v1.0.2
Commits
Clone
git clone https://git.rickub.com/turbo-editors/turbo-python.git
git clone ssh://git@rickub.com/turbo-editors/turbo-python.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

languages.md · 289 lines · 19.7 KBmarkdown Blame HistoryRaw
📦 Turbo Python 6fc62ea k33g 11h ago1# Référence : langages colorés
2
3> Description neutre des fichiers que Turbo Python colore, de la façon dont il décide, et de ce que reconnaît chaque scanner.
4
5## Reconnaissance
6
7L'**extension** d'un fichier décide dès qu'elle fait partie de celles-ci :
8
9| Extension | Langage |
10| --- | --- |
11| `.py`, `.pyi`, `.pyw` | Python |
12| `.toml` | TOML |
13| `.yaml`, `.yml` | YAML |
14| `.md`, `.markdown` | Markdown |
15| `.js`, `.mjs`, `.cjs` | JavaScript |
16| `.html`, `.htm` | HTML |
17| `.xml`, `.xsd`, `.xsl`, `.xslt`, `.svg`, `.plist`, `.csproj`, `.pom` | XML |
18| `.sh`, `.bash`, `.zsh` | Shell |
19| `.dockerfile`, `.containerfile` | Dockerfile |
20
21Les extensions sont comparées sans tenir compte de la casse, et seule la dernière compte : `main.py.backup` n'est pas du Python.
22
23Un fichier dont l'extension ne décide de rien est ensuite cherché par son **nom**. Seuls les fichiers sans extension exploitable en ont besoin :
24
25| Nom | Langage |
26| --- | --- |
27| `Dockerfile`, `Containerfile` | Dockerfile |
28
29Un nom correspond sur sa totalité ou sur la partie précédant le premier point, sans tenir compte de la casse — ainsi `Dockerfile`, `dockerfile` et `Dockerfile.dev` sont tous reconnus, tandis que `Dockerfile.md` est du Markdown, puisque l'extension est consultée en premier.
30
31Un fichier qu'aucun des deux tableaux ne revendique est lu par sa **première ligne**. Un shebang nommant `python` ou `python3` en fait du Python ; un shebang nommant un shell — `sh`, `bash`, `zsh`, `dash` ou `ksh` — en fait un script shell. L'interpréteur est reconnu comme élément de chemin ou comme argument d'`env`. C'est ce qui colore un script dans un répertoire `bin`, un hook git, ou `configure`.
32
33| Première ligne | Résultat |
34| --- | --- |
35| `#!/bin/sh` | Shell |
36| `#!/usr/bin/env bash` | Shell |
37| `#!/usr/bin/env -S bash -e` | Shell |
38| `#!/usr/bin/env python3` | Python |
39| `#!/usr/bin/python` | Python |
40| `#!/usr/bin/env node` | Non coloré |
41| Tout ce qui ne commence pas par `#!` | Non coloré |
42
43L'ordre est fixe — extension, puis nom, puis première ligne — et le premier qui décide l'emporte : un fichier `.md` commençant par un shebang Python reste du Markdown.
44
45Tout le reste est affiché en texte brut. Ce n'est pas une erreur — ouvrir un PNG dans l'éditeur n'est pas une faute, c'est simplement non coloré.
46
47## Classes
48
49Tous les scanners produisent le même vocabulaire de classes, et chacune correspond à une clé de thème.
50
51| Classe | Clé de thème | Produite par |
52| --- | --- | --- |
53| `identifier` | `syntax.identifier` | Python, TOML, JavaScript, shell, YAML, Dockerfile |
54| `keyword` | `syntax.keyword` | Python, JavaScript, shell, HTML (doctype), XML, Dockerfile |
55| `type` | `syntax.type` | Python, TOML (en-têtes de table), YAML (étiquettes) |
56| `builtin` | `syntax.builtin` | Python, JavaScript, shell (builtins et expansions), YAML (ancres et alias), Dockerfile (variables) |
57| `constant` | `syntax.constant` | Python, TOML, JavaScript, shell, YAML, HTML et XML (entités) |
58| `function` | `syntax.function` | Python, JavaScript, shell (la commande) |
59| `string` | `syntax.string` | tous |
60| `char` | `syntax.char` | rien ici ; la classe existe pour les langages qui ont un type caractère, et Python n'en a pas |
61| `number` | `syntax.number` | Python, TOML, JavaScript, shell, YAML, Dockerfile |
62| `comment` | `syntax.comment` | Python, TOML, JavaScript, shell, HTML, YAML, XML, Dockerfile |
63| `operator` | `syntax.operator` | Python, TOML, JavaScript, shell, HTML, YAML (en-têtes de scalaire de bloc), XML, Dockerfile |
64| `punctuation` | `syntax.punctuation` | Python, TOML, JavaScript, shell, Markdown, YAML, Dockerfile |
65| `heading` | `syntax.heading` | Markdown |
66| `tag` | `syntax.tag` | HTML, XML |
67| `attribute` | `syntax.attribute` | Python (décorateurs), HTML, XML, Dockerfile (options) |
68| `emphasis` | `syntax.emphasis` | Markdown |
69| `link` | `syntax.link` | Markdown |
70
71## Python
72
73Écrit à la main, dans `internal/pythonlang`. **Seule une chaîne franchit un saut de ligne**, et de deux manières : une chaîne à triple guillemet court jusqu'aux trois guillemets correspondants, et une chaîne à guillemet simple ne continue que si la ligne se termine par une contre-oblique. Le guillemet qui l'a ouverte est reporté, car un littéral ouvert par trois guillemets doubles et un littéral ouvert par trois apostrophes sont deux chaînes différentes.
74
75| Reconnu | Comme |
76| --- | --- |
77| `and`, `as`, `assert`, `async`, `await`, `break`, `class`, `continue`, `def`, `del`, `elif`, `else`, `except`, `finally`, `for`, `from`, `global`, `if`, `import`, `in`, `is`, `lambda`, `nonlocal`, `not`, `or`, `pass`, `raise`, `return`, `try`, `while`, `with`, `yield` | mot-clé |
78| `match` et `case`, lorsqu'ils ouvrent la ligne et que celle-ci se termine par `:` | mot-clé |
79| `True`, `False`, `None`, `NotImplemented`, `Ellipsis`, `__debug__` | constante |
80| `bool`, `bytearray`, `bytes`, `complex`, `dict`, `float`, `frozenset`, `int`, `list`, `memoryview`, `object`, `range`, `set`, `slice`, `str`, `tuple`, `type` | type |
81| tout autre nom commençant par une majuscule — `ValueError`, `Measurement` | type |
82| un nom écrit entièrement en majuscules — `MAX_SIZE`, `PI`, `HTTP_PORT` | constante |
83| `__init__`, `__repr__`, `__name__` et tous les autres noms en double soulignement | primitive |
84| `print`, `len`, `open`, `sorted`, `isinstance`, … ainsi que `self` et `cls` | primitive |
85| tout autre nom immédiatement suivi de `(` | fonction |
86| `"…"` et `'…'`, avec n'importe quel préfixe : `r`, `b`, `u`, `f`, `rb`, `br`, `fr`, `rf`, dans les deux casses | chaîne |
87| `"""…"""` et `'''…'''`, sur autant de lignes qu'il faut | chaîne |
88| une chaîne à guillemet simple dont la ligne finit par une contre-oblique, sur la ligne suivante | chaîne |
89| `42`, `1_000`, `0xFF`, `0o17`, `0b1010`, `.5`, `1.`, `1.5e-3`, `1E+7`, `3j` | nombre |
90| `#` jusqu'à la fin de la ligne, shebang compris | commentaire |
91| `@property`, `@app.route`, `@pytest.mark.parametrize` — le nom seulement | attribut |
92| `:=` | opérateur |
93| `:` partout ailleurs — un bloc, une tranche, un dictionnaire, une annotation | ponctuation |
94| `@` ailleurs qu'en début de ligne | opérateur |
95| une `\` en fin de ligne | ponctuation |
96| suites de `+-*/%=<>!&\|^~?` | opérateur |
97| `()[]{},;.` | ponctuation |
98
99**`match` et `case` ne sont des mots-clés que là où une instruction `match` les place.** Ils ne sont réservés dans aucun contexte — `match = re.match(motif, texte)` est du Python ordinaire — c'est donc la forme de l'instruction qui décide : le mot ouvre la ligne, et la ligne se termine par le deux-points qui ouvre son bloc. Les deux conditions doivent tenir.
100
101**Un nom écrit entièrement en majuscules est une constante, et tout autre nom capitalisé est un type.** La PEP 8 sépare assez nettement les deux conventions pour qu'on puisse les lire : `MAX_SIZE` est une constante et `Measurement` une classe. Turbo Rust n'a que la seconde règle et documente `SCREAMING_SNAKE_CASE` comme une réponse fausse connue ; ici, cette réponse mérite d'être supprimée plutôt qu'héritée.
102
103**Un nom capitalisé est un type même lorsqu'il est appelé.** `ValueError("non")` et `parse("non")` ont exactement la même forme, parce qu'une classe s'appelle comme une fonction — la parenthèse ne peut donc pas les distinguer, et c'est la convention qui doit le faire. C'est la seule règle que Turbo Python et Turbo Rust ordonnent différemment.
104
105**`self` et `cls` sont colorés comme des primitives bien que le langage ne les nomme pas.** C'est une convention : une méthode peut appeler son premier paramètre comme elle veut. Mais tout lecteur de Python lit `self` comme appartenant au langage, de la même façon qu'un lecteur de Rust lit `Some`, et tous les autres coloriseurs font pareil. Le prix à payer : un paramètre honnêtement nommé `self` dans une fonction ordinaire est coloré lui aussi.
106
107**Un décorateur s'arrête à ses arguments.** `@pytest.mark.parametrize("n", [1, 2])` colore le nom pointé comme un attribut et le reste comme du Python ordinaire, si bien que la chaîne et la liste qu'il contient gardent leurs propres couleurs.
108
109**Une contre-oblique soustrait le caractère qui la suit, y compris dans une chaîne brute.** `r"\""` est une chaîne complète : dans une chaîne brute la contre-oblique reste dans la valeur, mais elle empêche toujours le guillemet suivant de terminer le littéral. La règle de terminaison est donc la même pour les deux, et c'est pourquoi le caractère « brut » n'est pas reporté d'une ligne à l'autre.
110
111**Une chaîne qui atteint la fin d'une ligne sans l'une des deux raisons de continuer s'arrête là.** Elle est colorée jusqu'au bout de cette ligne et la ligne suivante redevient du code — parce qu'une chaîne à guillemet simple sans guillemet fermant est du code en cours de frappe, et que la reporter peindrait tout le reste du fichier.
112
113**Non reconnu**, chaque fois pour une raison énoncée :
114
115| Non reconnu | Parce que |
116| --- | --- |
117| L'`{expression}` à l'intérieur d'une f-string | Depuis Python 3.12 elle peut contenir n'importe quoi — guillemets imbriqués, commentaires, une autre f-string. Une seule plage de chaîne est la réponse honnête ; la colorer à moitié terminerait `f"{n:{width}}"` sur l'accolade intérieure |
118| `match` ou `case` sur une ligne portant un commentaire de fin | Le deux-points est cherché en remontant depuis la fin de la ligne, et un commentaire le masque : `match value: # aiguillage` colore donc `match` comme un nom. C'est le bon sens de l'erreur |
119| Une docstring comme autre chose qu'une chaîne | C'en *est* une — `help()` la relit comme telle — et la colorer en commentaire serait faux dès qu'on en affecte une à un nom |
120| Une classe dont le nom est tout en majuscules | `HTTP` est coloré comme une constante. C'est le prix de `MAX_SIZE` correctement coloré, et l'arbitrage suit le cas le plus fréquent |
121| `type` comme mot-clé souple de `type Alias = int` | C'est aussi un type primitif, et le lire comme le type est juste dans ses deux emplois |
122| Si un nom est lié dans cette portée | Rien ici ne lit plus d'une ligne à la fois ; c'est la question du serveur de langage, et [F1 y répond](../how-to/ask-about-code.md) |
123
124## TOML
125
126| Reconnu | Comme |
127| --- | --- |
128| `# commentaire` | comment |
129| `[table]`, `[[array]]` | le nom en type, les crochets en punctuation |
130| `clé =` | identifier, puis operator |
131| `"basique"`, `'littérale'`, `"""multi-ligne"""`, `'''multi-ligne'''` | string |
132| `true`, `false` | constant |
133| nombres, dates, heures, `inf`, `nan` | number |
134
135## YAML
136
137Un fichier compose, un manifeste Kubernetes et un workflow d'intégration continue sont tous cela : il n'y a pas de dialecte séparé, parce qu'un dialecte serait le schéma de quelqu'un d'autre à maintenir en phase.
138
139| Reconnu | Comme |
140| --- | --- |
141| `# commentaire` | commentaire |
142| `clé:` suivie d'une espace ou de la fin de ligne | la clé en identifiant, le deux-points en ponctuation |
143| `"entre guillemets": 1`, `'apostrophes': 1` | la clé citée en identifiant |
144| `- ` ouvrant une entrée de séquence | ponctuation |
145| `"…"`, `'…'` | chaîne |
146| `true`, `false`, `yes`, `no`, `on`, `off`, `null` | constante, quelle que soit la casse |
147| nombres, dates et heures écrits sans guillemets | nombre |
148| `&ancre`, `*alias` | builtin |
149| `!!str`, `!Custom` | type |
150| `---`, `...` | toute la ligne en ponctuation |
151| `{`, `}`, `[`, `]`, `,` | ponctuation |
152| `\|`, `>`, avec leurs indicateurs de coupe et d'indentation | l'en-tête en opérateur, le corps en chaîne |
153
154**Un deux-points n'est un séparateur que si une espace ou la fin de ligne le suit.** `image: nginx:1.27` est une clé et une seule valeur, et `url: http://example.com/x` une clé et une seule URL — colorer les deux-points intérieurs en séparateurs mettrait chaque étiquette d'image et chaque URL en trois couleurs.
155
156**L'étendue d'un scalaire de bloc est décidée par l'indentation**, pas par un délimiteur. La première ligne de contenu après `|` ou `>` fixe l'indentation du bloc ; toute ligne indentée au moins autant lui appartient, et la première qui ne l'est pas y met fin. **Une ligne vide à l'intérieur d'un bloc y reste** : un scalaire littéral conserve ses lignes vides, et terminer le bloc au premier saut de paragraphe couperait en deux un script shell dans un fichier d'intégration continue.
157
158**Un `#` a besoin d'une espace devant lui pour ouvrir un commentaire**, si bien que `colour: ff#00aa` est un seul scalaire.
159
160| Non reconnu | Parce que |
161| --- | --- |
162| Le schéma d'un fichier compose, d'un manifeste ou d'un workflow | Colorer `services:` autrement qu'une clé quelconque revient à transporter le schéma de quelqu'un d'autre, qui se périme le jour où il ajoute une clé |
163| Les flux multi-documents comme documents distincts | `---` est coloré, mais rien n'est réinitialisé à cet endroit ; rien dans la coloration ne dépend des frontières de documents |
164| Si un mot nu est une chaîne ou un nombre pour un analyseur | `1.2.3` est une version pour un lecteur et une chaîne pour YAML ; l'analyseur colore ce à quoi cela ressemble |
165
166## Markdown
167
168| Reconnu | Comme |
169| --- | --- |
170| `# Titre``###### Titre` | toute la ligne en heading |
171| `**gras**`, `__gras__`, `*italique*`, `_italique_` | emphasis |
172| `` `code` `` | string |
173| `[texte](cible)`, `![alt](src)` | l'ensemble en link |
174| `- `, `* `, `+ `, `1. `, `1) ` | le marqueur en punctuation |
175| `>` | punctuation |
176| `---`, `***`, `___` | punctuation |
177| clôtures ` ``` ` et `~~~` | tout le bloc, lignes d'ouverture et de fermeture comprises, en string |
178
179Un bloc clôturé est **d'une seule couleur quel que soit le langage annoncé** : ```` ```python ```` ne colore pas son contenu en Python. La suite de marqueurs qui ouvre un bloc doit être fermée par le même caractère : une clôture en accents graves ne se ferme pas par des tildes. Une clôture non fermée colore jusqu'à la fin du fichier.
180
181La suite de marqueurs qui ouvre une emphase doit être fermée par une suite de même longueur, de sorte que `**gras**` fasse un seul span et non deux italiques.
182
183## JavaScript
184
185| Reconnu | Comme |
186| --- | --- |
187| `const`, `let`, `function`, `class`, `async`, `await`, `import`, `export`, … | keyword |
188| `true`, `false`, `null`, `undefined`, `NaN`, `Infinity`, `this` | constant |
189| `console`, `document`, `window`, `Array`, `Object`, `Promise`, `Math`, `JSON`, … | builtin |
190| un nom immédiatement suivi de `(` | function |
191| `"…"`, `'…'` | string |
192| `` `` ``, interpolations comprises, sur plusieurs lignes | string |
193| `//` jusqu'à la fin de la ligne, `/* … */` sur plusieurs lignes | comment |
194| `42`, `3.14`, `0x1f`, `0b1010`, `0o777`, `1_000_000`, `1e6`, `10n` | number |
195| suites de `+-*/%=<>!&|^~?:` | operator |
196| `()[]{},;.` | punctuation |
197
198**Les littéraux d'expression régulière ne sont pas reconnus.** Distinguer `/x/g` d'une division exige de savoir si le token précédent pouvait terminer une expression ; une mauvaise supposition colore le reste de la ligne comme une chaîne, ce qui est pire que de laisser une regex à la couleur d'un opérateur.
199
200Les globales sont reconnues par leur nom : un fichier qui masque `Math` la voit quand même colorée comme un builtin — la même règle que les types primitifs de Python.
201
202## HTML
203
204| Reconnu | Comme |
205| --- | --- |
206| `<balise`, `</balise`, `>`, `/>` | tag |
207| noms d'attributs, dont `data-*`, `xlink:href`, `@click`, `v-bind.prop` | attribute |
208| `=` | operator |
209| `"…"`, `'…'` | string |
210| `<!-- … -->`, sur plusieurs lignes | comment |
211| `&amp;`, `&#169;` | constant |
212| `<!DOCTYPE …>` et les autres déclarations | keyword |
213
214Le texte entre balises n'est pas coloré. Une esperluette isolée sans `;` dans les 32 caractères qui suivent est laissée telle quelle, parce que c'est du texte légal.
215
216**Le contenu de `<script>` et de `<style>` n'est pas coloré** en JavaScript ni en CSS.
217
218## XML
219
220Son propre analyseur plutôt que celui du HTML, pour une raison qui compte : CDATA. Tout l'intérêt de `<![CDATA[ … ]]>` est que son contenu n'est *pas* du balisage, et colorer les balises qu'il contient comme des balises est exactement l'inverse.
221
222| Reconnu | Comme |
223| --- | --- |
224| `<?xml version="1.0"?>` et les autres instructions de traitement | la cible et `?>` en mot-clé, les paires entre les deux en attributs et chaînes |
225| `<!DOCTYPE …>` et les autres formes `<!` | mot-clé |
226| `<!-- … -->`, sur plusieurs lignes | commentaire |
227| `<![CDATA[ … ]]>`, sur plusieurs lignes | chaîne |
228| `<balise`, `</balise`, `>`, `/>` | balise |
229| `<ns:balise>`, `xsi:type` | le préfixe et le nom local en **un seul** segment |
230| les noms d'attributs | attribut |
231| `=` | opérateur |
232| `"…"`, `'…'` | chaîne |
233| `&amp;`, `&#169;` | constante |
234
235**Un commentaire et une section CDATA se ferment sur des délimiteurs différents**, et sont transportés séparément : un `-->` à l'intérieur d'une section CDATA n'y met pas fin.
236
237**Une esperluette isolée sans point-virgule dans les 32 caractères suivants est laissée telle quelle**, parce que c'est du texte légal dans bien des documents et qu'avaler le reste de la ligne serait la plus grosse erreur.
238
239Le texte entre balises n'est pas coloré.
240
241## Shell
242
243S'applique indifféremment à `sh`, `bash` et `zsh` : les mots-clés reconnus sont ceux qu'ils partagent.
244
245| Reconnu | Comme |
246| --- | --- |
247| `if`, `then`, `fi`, `for`, `while`, `case`, `esac`, `function`, `return`, … | keyword |
248| `true`, `false` | constant |
249| `echo`, `printf`, `export`, `local`, `read`, `cd`, `set`, `source`, … | builtin |
250| `$NOM`, `${…}`, `$(…)`, `$1`, `$?`, `$@` | builtin |
251| le **premier mot nu d'une ligne** | function |
252| tout mot nu suivant, et `NOM` dans `NOM=valeur` | identifier |
253| `'…'`, sans échappement ni expansion à l'intérieur | string |
254| `"…"`, avec les expansions colorées comme telles | string |
255| `#` jusqu'à la fin de la ligne | comment |
256
257`$(a $(b) c)` fait un seul span : l'imbrication est comptée. Une option comme `-euo` est un seul mot, et non un moins suivi d'un mot.
258
259**Les heredocs ne sont pas reconnus.** `<<EOF` et le texte qui suit sont colorés comme du shell ordinaire.
260
261## Dockerfile
262
263| Reconnu | Comme |
264| --- | --- |
265| `FROM`, `RUN`, `COPY`, `ADD`, `ARG`, `ENV`, `CMD`, `ENTRYPOINT`, `EXPOSE`, `LABEL`, `USER`, `VOLUME`, `WORKDIR`, `HEALTHCHECK`, `ONBUILD`, `SHELL`, `STOPSIGNAL`, `MAINTAINER` | mot-clé, quelle que soit la casse |
266| `AS`, `NONE` | mot-clé |
267| `# commentaire`, y compris les directives `# syntax=` et `# escape=` | commentaire |
268| `--from=builder`, `--chown=me:me` | le nom de l'option en attribut |
269| `$NOM`, `${NOM}`, `${NOM:-defaut}` | builtin, en un seul segment jusqu'à l'accolade fermante |
270| `"…"`, `'…'` | chaîne |
271| un `\` final | opérateur |
272| les nombres | nombre |
273| chemins et références d'images — `/usr/local/bin`, `golang:1.26-alpine` | identifiant, en **un seul** segment |
274
275**Seul le premier mot d'une ligne peut être une instruction**, et un mot qui n'en est pas une est un argument — ce qui garde le premier mot d'une ligne de continuation hors de la couleur des mots-clés.
276
277**Rien ne traverse un saut de ligne.** Un `\` joint deux lignes pour Docker, mais chaque moitié se lit encore comme une commande et est colorée pour elle-même.
278
279| Non reconnu | Parce que |
280| --- | --- |
281| Le shell à l'intérieur d'un `RUN` | Il faudrait passer l'analyseur shell sur une partie de ligne et en remonter les colonnes, et un `RUN` peut contenir n'importe quel langage |
282| Les heredocs dans un `RUN` | La même raison que pour l'analyseur shell |
283| Quelle étape nomme un `--from` | Rien ici ne lit le reste du fichier |
284
285## Voir aussi
286
287- [Format des fichiers de thème](themes.md) — toutes les clés vers lesquelles ces classes se résolvent
288- [Coloration et complétion](../explanation/colouring-and-completion.md) — pourquoi les scanners sont écrits ainsi
289- [Écrire son propre thème](../how-to/write-a-theme.md)