Ce qui appartient ici — explication
De quoi s'agit-il ?
turbo-core et les éditeurs bâtis dessus sont une même base de code coupée en deux. Cette page parle de l'endroit où tombe la coupure, de pourquoi elle tombe là, et de quoi faire quand quelque chose de neuf n'appartient manifestement à aucun des deux côtés.
Le critère
Demandez : un troisième éditeur, pour un langage auquel personne n'a encore pensé, voudrait-il ceci exactement tel quel ?
Si oui, cela appartient à la bibliothèque. S'il en voudrait quelque chose comme ça mais pas ça, cela appartient à l'éditeur — et ce que la bibliothèque lui doit est une couture, pas un cas particulier.
C'est cette question qui met l'analyseur Go dans Turbo Go et l'analyseur Markdown dans la bibliothèque. Un éditeur Zig veut l'analyseur Markdown inchangé, parce que son README est du Markdown. Il ne veut pas du tout de l'analyseur Go.
Ce qui est de chaque côté
| La bibliothèque | Un éditeur |
|---|---|
| Le composant d'édition, les fenêtres, les menus, les dialogues | Quel serveur de langage, et comment le trouver |
| Onze thèmes et le chargeur | Le nom sur la boîte À propos |
| La coloration de TOML, YAML, Markdown, JavaScript, HTML, XML, Dockerfile et shell | La coloration de son langage |
| Lire et écrire les fichiers de réglages, d'extraits et d'outils | Ce qu'il y a dans ces fichiers quand on les crée |
| Le client LSP et le processus | L'étiquette du menu de la chaîne d'outils |
| L'émulateur VT et le pseudo-terminal | Le fichier qui marque la racine d'un projet |
Remarquez le motif dans la colonne de droite : ce ne sont que des affirmations sur un langage, et rien n'y est du comportement. Ce n'est pas un hasard — c'est ce qui a rendu l'extraction possible. Un éditeur bâti sur turbo-core ne contient presque aucune logique, et c'est pourquoi en écrire un prend un après-midi plutôt qu'un fork.
Le seul endroit où du comportement traverse la frontière
L'analyseur. La coloration d'un langage est du vrai code — celle de Turbo Rust fait trois fichiers et trois cents lignes — et elle ne peut pas être des données, parce qu'un analyseur pour un langage à commentaires de bloc imbriqués et à chaînes brutes ne s'exprime pas dans une table.
C'est pourquoi la bibliothèque exporte une boîte à outils d'analyse plutôt qu'un langage de motifs. Ajouter un langage veut dire écrire du Go ordinaire à côté de ceux qui existent déjà, plutôt qu'apprendre une notation. Le coût est une API publique large ; l'alternative était un format de grammaire, qui est une fonctionnalité à part entière et que personne n'aurait pu étendre sans l'apprendre.
Ce qui est délibérément absent
Un système de greffons. Un éditeur est un programme Go qui importe une bibliothèque. Il n'y a ni chargement dynamique, ni manifeste, ni ABI, et en ajouter un voudrait dire figer l'API de tous les paquets plutôt que de la poignée qu'un profil touche.
Un fichier de configuration pour le profil. Le profil aurait pu être du TOML lu au démarrage, ce qui ferait d'un nouvel éditeur un fichier plutôt qu'un programme. Cela rendrait aussi l'analyseur inexprimable, et un éditeur à moitié configurable — tout sauf la coloration — est pire que l'une ou l'autre réponse entière.
Un fichier d'outils au niveau de l'utilisateur. Les extraits sont vos habitudes et vous suivent d'un projet à l'autre, donc il y a un fichier d'extraits utilisateur. Les outils d'un projet appartiennent à sa propre chaîne d'outils, et un fichier global proposerait go build dans un dépôt Rust.
La détection de langage par le contenu. Un fichier est reconnu par son extension, puis par son shebang, et par rien d'autre. Deviner d'après le corps d'un fichier est faux assez souvent pour être pire que se taire.
Quoi faire quand quelque chose ne rentre pas
Deux modes d'échec, tous deux déjà survenus ici :
Mettre l'opinion d'un éditeur dans la bibliothèque. tools.DefaultMenu était la constante "Go". Elle a été juste pendant un an et fausse à l'instant où il y a eu deux éditeurs. Le correctif n'était pas d'ajouter une seconde constante ; c'était de remarquer que le menu par défaut est une affirmation sur un éditeur et de le déplacer dans le profil.
Mettre du comportement de bibliothèque dans un éditeur. Le main.go de Turbo Go remontait à la recherche d'un go.mod. Cette remontée ne parle pas de Go — tout langage a une racine de projet — donc elle est devenue app.ProjectRoot(p, files) avec le marqueur dans le profil, et Turbo Rust l'a obtenue gratuitement en écrivant "Cargo.toml".
Le signal est le même dans les deux cas : un morceau de code qui nomme un langage et qui ne parle pas de ce langage.
Comment cela se relie au reste
La frontière est tenue par les tests autant que par le goût. La suite de turbo-core pilote un éditeur fictif appelé Turbo Test — avec son propre slug, son propre menu, ses propres modèles — précisément pour qu'un test ne puisse pas supposer en douce les réponses de Turbo Go. Un test dans la bibliothèque qui attendrait le menu Go testerait les choix d'un éditeur depuis l'intérieur de la bibliothèque hors de laquelle ces choix sont faits.
Voir aussi
- La forme qui en résulte : architecture
- Comment mettre un langage du bon côté : ajouter un langage
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|