La référence : chaque fonction, ce qu’elle fait, comment s’en servir et ce qu’elle ne fait pas, domaine par domaine. Pour un premier tour de l’éditeur, voir Premiers pas ; pour une tâche du début à la fin, les Guides pratiques ; pour comprendre ses choix, Comprendre l’éditeur. Chaque touche, chaque réglage et chaque entrée de la palette / sont listés à part dans Raccourcis clavier, Tous les réglages et Le catalogue de la palette /. Les images sont prises dans l’éditeur lui-même ; le projet qu’elles montrent est un petit journal de potager.

Les menus s’écrivent Menu › Sous-menu › Commande. Fichier est le menu du document où vous êtes, Projet celui du dossier ouvert, Éditeur celui du programme lui-même. La plupart des commandes markdown sont aussi des lignes du panneau markdown (Ctrl+Maj+M).

La fenêtre, en une image :

Une note avec son aperçu : l'explorateur à gauche, le texte, l'aperçu à côté, le plan à droite
Une note avec son aperçu : l'explorateur à gauche, le texte, l'aperçu à côté, le plan à droite
  • Les rails, les fines colonnes de chaque côté, portent une icône par panneau. Un clic ouvre le panneau, un second le ferme. Quel panneau va de quel côté, et dans quel ordre, c’est vous qui décidez — réglages rail_order et *_side.
  • Les onglets, en haut, sont les documents ouverts dans cette fenêtre. Une fenêtre contient un projet ; Éditeur › Nouvelle fenêtre (Ctrl+Maj+N) en ouvre une autre.
  • Le texte, et à côté l’aperçu en direct (Ctrl+Maj+B), ou l’aperçu à la place du texte (Ctrl+Maj+V). Côte à côte, chacun suit l’autre titre par titre.
  • La barre d’état indique le fichier, la feuille de style utilisée par l’aperçu — cliquez dessus pour en choisir une autre —, le langage et la position du curseur.

Écrire

Gras, italique, barré

Sélectionnez du texte et appuyez sur Ctrl+B (gras), Ctrl+I (italique) ou Ctrl+Maj+X (barré) — ou Fichier › Mise en forme. La sélection est entourée de **…**, *…* ou ~~…~~ ; la même touche une seconde fois retire les marques, et la sélection reste où elle était. Sans sélection, les marques sont écrites et le curseur se place entre elles, prêt pour le mot.

  • Pas de souligné : markdown n’en a pas.
  • L’italique s’écrit *…*, jamais _…_, pour que le formateur ne le défasse pas.

Des listes qui se poursuivent seules

Dans un élément de liste, Entrée commence l’élément suivant au même niveau : la même puce, le numéro suivant, ou une case vide - [ ] dans une liste de tâches. Ce qui suivait le curseur passe dans le nouvel élément.

  1. Tapez - lait puis Entrée : un nouveau - vous attend.
  2. Entrée sur cet élément vide : il remonte d’un niveau.
  3. Entrée sur un élément vide au premier niveau : la liste est finie et la ligne reste vide.

Maj+Entrée coupe la ligne sans commencer d’élément. Dans un bloc de code délimité, Entrée est un simple retour à la ligne.

Formater un fichier

Fichier › Formater ce fichier (Ctrl+Maj+I) réécrit le document dans le style habituel de son langage. Markdown, JavaScript, TypeScript, JSON, CSS, HTML, XML, Vue, YAML, TOML et PHP sont formatés par l’éditeur lui-même, sans rien à installer ; Rust, Go, shell et Python passent par rustfmt, gofmt, shfmt ou ruff s’ils sont installés. Dans un projet qui a un dprint.json, dprint passe en premier pour tous les langages sauf markdown.

  • Un fichier déjà formaté n’est pas touché, et la barre d’état le dit. Un fichier qui ne s’analyse pas n’est pas modifié, et l’erreur s’affiche.
  • En markdown, les tableaux sont alignés, les listes et les titres régularisés, et un indice comme H~2~O reste tel qu’écrit.
  • Réglages : tab_size, insert_spaces et line_width valent pour tous les langages ; format_wrap_text = true recoupe aussi les longs paragraphes ; format_on_save ("off", "embedded", "always") formate à chaque enregistrement.

Vérifier l’orthographe

Fichier › Vérifier l’orthographe souligne d’une vague rouge chaque mot du texte que le dictionnaire ne connaît pas. La barre d’état dit combien, et dans quel dictionnaire.

  1. Ouvrez un document markdown et choisissez Fichier › Vérifier l’orthographe.
  2. Corrigez un mot : les soulignements se mettent à jour à chaque pause de la frappe.
  3. Choisissez de nouveau Vérifier l’orthographe pour l’arrêter.
  • Ce qui est vérifié : le texte seulement — ni le code, ni le HTML, ni les maths, ni l’en-tête YAML, ni l’adresse d’un lien, ni le nom de fichier d’un wikilien, ni un #mot-clé, ni un mot contenant un chiffre ou un _.
  • La langue : le lang: de l’en-tête du document (fr, en-GB…), sinon la langue de l’éditeur.
  • Ce qu’il faut : enchant-2 et un dictionnaire pour cette langue (hunspell-fr, hunspell-en-us…). Sans l’un ou l’autre, la barre d’état dit ce qui manque et la vérification s’arrête d’elle-même. Voir Installer.
  • Limites : pas encore de suggestions ni de dictionnaire personnel ; la grammaire n’est pas vérifiée. La vérification appartient au seul document où elle a été lancée.

La palette /

Certaines constructions markdown se tapent vite, d’autres non. Un encadré, ce sont quatre crochets, un point d’exclamation et un mot en capitales ; une note de bas de page, c’est un appel à un endroit et sa note à un autre ; un tableau, ce sont trois lignes de barres verticales avant même d’y mettre quoi que ce soit. La palette est faite pour celles-là.

La palette /
La palette /

L’ouvrir

Dans un document markdown, tapez / en début de mot — en début de ligne, ou après une espace. Une liste apparaît sous le curseur, et ce que vous tapez la filtre.

/tab          → Tableau
/note         → Note · Note (repliée)
/repl         → les cinq encadrés repliés
/alert        → les dix encadrés

La recherche porte sur le nom affiché, dans la langue de l’interface : /tab trouve Tableau en français et Table en anglais. Un mot n’importe où dans le nom suffit, ce qui permet à /repl d’atteindre Note (repliée).

Deux façons d’y entrer, volontairement différentes

Une / seule permet de parcourir. Elle montre le niveau où vous êtes — quatre entrées au premier niveau, quatre sous Markdown, dix sous Alertes —, et une entrée marquée › ouvre ses propres entrées au lieu d’écrire quoi que ce soit. ‹ en haut de la liste, ou Échap, permet de remonter.

Dès que vous tapez, la recherche porte sur tout, à plat. Une seule lettre après la /, et le niveau n’a plus d’importance : toute entrée qui écrit quelque chose est candidate, où qu’elle soit rangée. /note atteint toujours Note en une touche, d’où que vous partiez.

C’est pourquoi le second niveau ne coûte rien. Un sous-menu, c’est ce qui rend d’ordinaire une liste impossible à chercher ; celle-ci ne l’est jamais : l’arborescence sert de carte, la saisie de raccourci, et rien n’est accessible par l’une sans l’être par l’autre.

Le nom d’un groupe est aussi une recherche. Une entrée correspond aux noms des groupes qui la contiennent autant qu’au sien : /alert propose les dix encadrés et /util la date et l’heure — toute une branche, sans la parcourir.

L’ignorer

Taper ne valide jamais rien. C’est la règle sur laquelle repose tout le reste, et il n’y a rien à apprendre pour s’y fier :

  • tapez un mot qui n’est pas une commande, et la liste disparaît — /bidule est un mot comme un autre, et chacun de ses caractères reste où vous l’avez tapé ;
  • tapez une espace, et la liste disparaît, car une barre oblique suivie d’un mot est du texte ;
  • appuyez sur Échap, et la liste disparaît en gardant la / et tout ce qui suit — à l’intérieur d’un groupe, Échap commence par en sortir ;
  • cliquez ailleurs, et la liste disparaît.

Une / au milieu d’un mot ne l’ouvre jamais : /home/user et le 12/09 restent toujours du texte.

Choisir

Entrée, Tab, ou un clic. Les flèches parcourent la liste et reviennent au début après la fin, et inversement. Votre choix remplace la / et ce que vous avez tapé après, en une seule étape — une seule annulation remet /tableau exactement comme avant.

Sur une entrée marquée ›, les mêmes touches l’ouvrent, sans rien écrire.

Ce qu’elle contient

Une / seule propose quatre entrées :

Tableau Un nouveau tableau, écrit dans le document et ouvert dans la grille. Le même que celui de la commande Insérer un tableau
Markdown › Encadrés, formules, notes de bas de page et code
Utilitaires › La date et l’heure
Caractères › Les symboles et émojis utilisés récemment, et tous les autres — voir Les caractères

Markdown › :

Alertes › Les dix encadrés, ci-dessous
Titre Du même niveau que le titre précédent — voir plus bas
Gras, Italique, Barré **…**, *…*, ~~…~~, le curseur entre les marques
Citation Une ligne citée, commençant par >
Lien, Image […]() et ![…](), le curseur dans la première paire
Lien vers un fichier, Incorporer un fichier [[…]] et ![[…]] — un fichier désigné par son nom, et le contenu d’un fichier inséré dans la page
Lien vers un nouveau fichier Un [[…]] qui crée le fichier qu’il désigne s’il n’existe pas — plus bas
Mathématiques Une formule en bloc entre $$ et $$, avec la fenêtre de formule ouverte dessus
Note de bas de page Un appel à l’endroit où vous êtes — il demande d’abord quelle note ; voir plus bas
Bloc de code Un bloc délimité, le curseur sur le langage
En-tête du document Un bloc de clés en haut du fichier — voir plus bas

Markdown › Alertes › :

Note, Astuce, Important, Avertissement, Attention Les cinq encadrés
Les cinq mêmes, repliés L’encadré écrit > [!NOTE]-, qui s’ouvre replié et se déplie d’un clic

Utilitaires › :

Date La date du jour, sous la forme 2026-09-20
Heure L’heure actuelle, sous la forme 14:32

Vingt-quatre entrées qui écrivent quelque chose, l’une à une touche et toutes les autres à un mot.

Le gras et l’italique y figurent, ce qui n’a pas toujours été le cas. Ctrl+B et Ctrl+I sont plus rapides que n’importe quel menu — pour qui les connaît. Ils ne servent à rien à qui ne sait pas encore que ** signifie gras, et cette liste sert en grande partie à apprendre la syntaxe : il serait étrange d’y supposer la syntaxe déjà acquise.

Trouver une entrée par un mot qui n’y figure pas

La recherche porte sur le nom affiché, et certaines entrées répondent aussi à d’autres mots : /img et /photo trouvent Image, /yaml et /métadonnées trouvent En-tête du document, /entête trouve Titre. Le nom propre d’une entrée l’emporte toujours sur le synonyme d’une autre.

Cinq entrées se comportent un peu différemment

Titre s’insère au niveau du titre précédent. Sous un ##, il écrit ## ; sous un ###, ### ; dans un document encore sans titre, #. C’est la seule entrée qui lit votre document avant d’écrire, et elle existe pour vous éviter de compter à quelle profondeur vous êtes.

L’en-tête du document va en haut du fichier, où que vous l’ayez demandé. C’est le seul endroit où un en-tête en est un — trois lignes avec des tirets au milieu d’un document ne sont que trois lignes. Si le document a déjà un bloc, rien n’est ajouté et le curseur va dans le bloc existant : deux blocs ---, aucun lecteur de markdown ne sait les interpréter.

Tableau ouvre la grille sur ce qu’il vient d’écrire. Le balisage est d’abord écrit dans le document, pour qu’il y soit que vous fassiez quelque chose dans la fenêtre ou non, puis la grille s’ouvre dessus — la même fenêtre que la commande Modifier le tableau en grille, mais sur le tableau que vous venez de créer plutôt que sur un tableau qu’il aurait fallu aller chercher.

Note de bas de page vous demande de quelle note il s’agit, car elle ne peut pas le deviner : une note de bas de page est soit une nouvelle note, qui a besoin de son texte, soit un nouvel appel à une note que le document contient déjà.

  • Une nouvelle note — tapez son texte. L’appel est placé où vous êtes et la définition au bas du fichier, avec le plus petit numéro libre. Une note que vous avez nommée vous-même, [^pourquoi-ceci], n’entre pas dans ce compte.
  • Une note existante — choisissez-la dans la liste, qui montre l’étiquette et le début du texte de chaque note. Seul l’appel est écrit ; la définition n’est pas répétée, car deux définitions pour une même étiquette, c’est ainsi qu’un document se retrouve avec deux notes portant le même numéro.

Dans les deux cas, le curseur reste sur l’appel. Vous étiez en train d’écrire une phrase, la note n’y est qu’une marque : c’est la phrase que vous continuez d’écrire. Rien n’est écrit tant que vous n’avez pas répondu : Échap à la question laisse votre saisie exactement comme vous l’avez tapée. Un document sans aucune note de bas de page ne pose pas la question : le champ s’ouvre directement.

La date et l’heure s’écrivent toujours de la même façon, 2026-09-20 et 14:32, quelle que soit la langue de l’interface. Une date dans une note sert généralement à trier ou à chercher, et une date qui change de forme selon la langue ne permet ni l’un ni l’autre.

Où elle fonctionne

Uniquement dans les documents markdown. Chaque entrée écrit une construction markdown, et dans un fichier Rust ou Python, / commence un commentaire, un chemin ou une expression régulière, pas une demande.

Tableaux

La fenêtre de tableau au-dessus d'un tableau markdown
La fenêtre de tableau au-dessus d'un tableau markdown

Un tableau markdown, avec ses barres verticales, se lit facilement mais se modifie péniblement : il faut retoucher chaque ligne pour garder les colonnes alignées, et une colonne ajoutée sur une ligne mais oubliée sur une autre donne un tableau qui n’en est plus un.

Les quatre commandes

Elles agissent sur le tableau où se trouve le curseur, et chacune le réécrit aligné.

Insérer un tableau Trois colonnes et deux lignes, le curseur dans la première cellule
Ajouter une ligne au tableau Sous celle du curseur
Ajouter une colonne au tableau De même
Aligner le tableau sous le curseur Réaligner les colonnes

La grille

Ctrl+Maj+T, ou Modifier le tableau en grille dans la section Tableau du panneau markdown, ouvre le tableau du curseur sous forme de grille de cellules. C’est l’autre façon de modifier un tableau, celle qu’il vous faut dès que le changement ne se limite pas à une ligne.

C’est une fenêtre à part entière, rattachée à celle de l’éditeur : vous pouvez la déplacer, la redimensionner, l’agrandir, la mettre sur votre autre écran. Votre bureau décide où elle s’ouvre — en général au centre de l’éditeur — et la garde au premier plan. Tant qu’elle est ouverte, l’éditeur derrière est bloqué, pour que le tableau ne puisse pas bouger sous la grille.

Chaque cellule est un champ de saisie ; les boutons qui les entourent font tout l’intérêt de la grille.

Au-dessus de chaque colonne, dans l’ordre : son alignement, un bouton qui passe d’une valeur à l’autre — · pour laisser le choix au moteur de rendu, puis L, C, R (gauche, centre, droite) ; son tri ; ◀ et ▶ pour la déplacer d’un cran ; et × pour la supprimer. Au bout de chaque ligne du corps : ▲ et ▼ pour la déplacer, et × pour la supprimer.

En bas, entre les deux boutons qui ajoutent au tableau et les deux qui ferment la fenêtre : les quatre mêmes alignements — ·, L, C, R —, qui s’appliquent cette fois à toutes les colonnes à la fois, et ⤢, qui ajuste la fenêtre à la taille du tableau.

Trier

Le bouton de tri indique ce qu’il va faire. ↕ : le tableau n’est pas trié selon cette colonne ; appuyez, le corps est trié par ordre croissant et le bouton devient ↑ ; appuyez de nouveau pour l’ordre décroissant, ↓.

  • Une colonne qui ne contient que des nombres est triée comme des nombres. 1 234, 1,234 et 12% sont tous des nombres, puisque c’est ainsi qu’on les écrit. Il suffit d’une cellule qui n’en est pas un pour que toute la colonne soit triée comme du texte, sans tenir compte des majuscules.
  • Les cellules vides vont à la fin, dans un sens comme dans l’autre : une cellule vide est un manque, pas une valeur.
  • Le tri est stable : trier selon une colonne puis selon une autre conserve le premier tri à l’intérieur du second.
  • L’en-tête ne bouge jamais, et le document non plus tant que vous n’avez pas cliqué sur Appliquer.

Toute autre modification — une ligne déplacée, une colonne supprimée — remet le bouton sur ↕, puisque les lignes ne sont plus dans l’ordre de cette colonne.

Aligner tout le tableau

Les quatre boutons du bas sont les quatre alignements du bouton placé au-dessus d’une colonne, appliqués à toutes : appuyez sur C et chaque colonne est centrée. Contrairement au bouton d’une colonne, ils ne font pas défiler les valeurs. Le bouton d’une colonne peut montrer l’état de cette colonne et passer d’un alignement à l’autre ; un bouton pour tout le tableau n’a aucun état à montrer, puisque les colonnes peuvent différer — d’où quatre boutons, et vous appuyez sur celui que vous voulez.

· est un alignement à part entière, pas une absence d’alignement : la colonne ne précise rien et laisse le moteur de rendu décider.

Ajuster la fenêtre

⤢ donne à la fenêtre la taille dont le tableau a besoin, pour qu’il soit tout entier à l’écran sans défilement. Les limites sont les mêmes qu’à l’ouverture : un tableau qui les dépasse défile toujours, et agrandir la fenêtre à la main, ou la maximiser, reste le moyen d’aller au-delà.

La fenêtre n’est pas déplacée. Sa position regarde votre bureau et vous ; un bouton qui ramènerait la grille au milieu de l’écran à chaque appui serait un bouton qu’on n’utiliserait qu’une fois.

Déplacer

◀, ▶, ▲ et ▼ déplacent une colonne ou une ligne du corps d’une place. Le bouton en bout de course ne fait rien, plutôt que de faire le tour : une ligne ne peut pas sauter du bas vers le haut sous votre main. Une colonne emporte son alignement avec elle.

L’en-tête n’est pas une ligne du corps : il n’a ni ▲ ni ▼. Le déplacer dans le corps laisserait la ligne de tirets décrire la première ligne de données.

Ce qu’elle refuse
  • L’en-tête ne peut pas être supprimé. Un tableau markdown sans en-tête n’est pas un tableau : c’est la ligne de tirets en dessous qui en fait un.
  • La dernière colonne ne peut pas être supprimée non plus, pour la même raison. Pour se débarrasser d’un tableau, le plus simple est d’effacer son texte.
  • Une barre verticale tapée ou collée dans une cellule est neutralisée plutôt que refusée : sinon, elle ouvrirait une colonne que les tirets n’ont pas. Elle est écrite dans le document sous la forme \| et revient dans la cellule sous la forme | : la grille montre ce que vous vouliez dire, pas la façon dont markdown a dû l’écrire.

Appliquer — ou Ctrl+Entrée — réécrit le tableau à sa place, aligné, sans toucher à ce qui l’entoure. Annuler, Échap ou le bouton de fermeture de la fenêtre n’écrivent rien. Fermer l’éditeur ferme aussi la grille.

Un tableau de plus de 24 colonnes ou de plus de 200 lignes s’ouvre dans le texte plutôt que dans la grille, et l’éditeur vous le dit : chaque cellule est un champ de saisie, et au-delà d’un certain nombre, la grille devient plus lente à utiliser que le texte qu’elle remplace.

La fenêtre s’ouvre à la taille que demande le tableau, dans la limite du raisonnable, et les colonnes se partagent sa largeur, chacune gardant au moins la place d’environ un bouton et demi. Un tableau plus large défile horizontalement — ou vous élargissez la fenêtre. Un tableau plus long que la fenêtre défile verticalement, avec une barre de défilement, et les boutons du bas restent en place.

Son clavier

Entrée la cellule suivante, en revenant à la première après la dernière
Tab de même
Maj+Entrée un retour à la ligne dans la cellule
Ctrl+Entrée Appliquer
Échap Annuler

Entrée insérait autrefois un retour à la ligne. Il passe désormais à la cellule suivante, car c’est ce que demande vraiment le remplissage d’une grille : un retour à la ligne dans une cellule est rare, passer à la cellule suivante, c’est tout le temps.

Plusieurs lignes dans une cellule

Maj+Entrée dans une cellule insère un retour à la ligne. Un tableau markdown ne peut pas contenir de vrai saut de ligne — il terminerait la ligne et couperait le tableau en deux —, si bien que le saut est écrit <br> dans le document : c’est ce que GitHub affiche comme un retour à la ligne dans une cellule, et la seule façon d’en demander un.

Un champ montre le texte source de la cellule. Rouvrez la grille et ce <br> apparaît comme quatre caractères dans le champ, pas comme un saut de ligne — tout comme **gras** fait huit caractères et `code` six. La grille modifie du markdown, elle ne l’affiche pas mis en forme ; une grille qui interpréterait une seule balise et laisserait les autres en texte donnerait une idée fausse des autres. Seule exception : \|, affiché comme la barre qu’il représente, car cette barre oblique n’est pas une balise — c’est simplement la façon dont un tableau markdown oblige à écrire une barre verticale.

Les cellules se partagent la hauteur de la fenêtre. Agrandissez la grille en hauteur et chaque cellule grandit avec elle, une ligne entière à la fois : un tableau de paragraphes devient une grille de paragraphes, et non une grille de cases d’une ligne. Réduisez-la, et les cellules reviennent à une ligne chacune et le tableau défile — une cellule plus basse qu’une ligne n’aurait pas la place d’afficher un curseur.

⤢ est l’autre bout de cette règle : il demande exactement la taille à laquelle chaque cellule tient sur une ligne.

Tab et Entrée passent tous deux à la cellule suivante, comme on remplit une grille.

Deux tailles

L’éditeur a trois réglages de taille de police, et la grille en utilise deux, pour des choses différentes. (Le troisième, pane_font_size, concerne l’explorateur et le plan ; une grille n’est pas un panneau.)

  • font_size — la taille du texte que vous écrivez — est celle du texte dans les cellules. Elles contiennent votre texte : elles sont donc à la même taille que lui dans l’éditeur.
  • interface_font_size est la taille de tout ce qui les entoure : les boutons, leurs libellés, et la place accordée à une colonne pour les contenir.

Augmenter la taille du texte agrandit donc les cellules sans agrandir les boutons, et augmenter celle de l’interface fait l’inverse.

Formules

La fenêtre de formule, qui construit la somme au fil de la saisie
La fenêtre de formule, qui construit la somme au fil de la saisie

Placez le curseur dans une formule, $…$ ou $$…$$, et appuyez sur Ctrl+Maj+L (Fichier › Mise en forme › Formule…). Une fenêtre s’ouvre avec la formule dessinée comme dans l’aperçu, et un clavier de structures — fractions, racines, sommes, matrices, lettres grecques.

  1. Tapez dans l’éditeur, ou cliquez sur une structure pour l’insérer.
  2. Appliquer (Ctrl+Entrée) réécrit le TeX à sa place, sous la même forme ($…$ reste en ligne). Annuler (Échap) n’écrit rien.
  • Curseur hors de toute formule, la fenêtre en commence une vide : $$…$$ sur une ligne vide, $…$ au milieu d’une phrase. La même touche ferme la fenêtre.
  • Une formule laissée telle quelle n’est pas réécrite. Une formule en TeX que l’éditeur ne sait pas relire fidèlement — une macro à vous — le dit avant toute frappe, et vous pouvez encore annuler.

Couleurs

La fenêtre des couleurs, avec les couleurs déjà utilisées dans ce fichier
La fenêtre des couleurs, avec les couleurs déjà utilisées dans ce fichier

Ctrl+Maj+K (Fichier › Couleurs) ouvre la fenêtre des couleurs ; Insérer écrit la couleur où était votre curseur. Et dans les fichiers où l’on écrit des couleurs, chaque code couleur montre sa couleur.

Un code couleur porte sa propre couleur

Dans un fichier CSS, SCSS, JSON, markdown, HTML, Vue, SVG ou XML, une couleur écrite #ff8800 — ou #f80, ou avec une opacité à la fin — reçoit une pastille : son # prend cette couleur, et le reste du code garde la couleur que lui donne la coloration syntaxique. Rien n’est inséré dans le fichier et rien ne bouge : la ligne garde exactement la même largeur.

Pas de carré à côté du code, comme en dessinent d’autres éditeurs et comme celui-ci ne peut pas le faire : ici, une décoration met en forme du texte existant, alors qu’un carré de couleur est une boîte ajoutée à côté d’un texte qui n’existe pas. Colorer un caractère du code est ce qui s’en approche le plus — et c’est la moitié qui se lit bien, puisque le code garde une couleur choisie pour être lisible, et non pour se poser sur la couleur décrite.

Une couleur identique au fond de l’éditeur donne une pastille invisible — #04161f dans Kaivalya Blue, par exemple. Une bordure résoudrait le problème, mais les décorations utilisées ici n’en ont pas.

Seules les couleurs en # sont concernées. rgb() et hsl() forment une petite grammaire à part, avec pourcentages, barres obliques, trois ou quatre arguments, et une portion colorée de la mauvaise couleur serait pire qu’une portion pas colorée du tout.

L’analyse a lieu quand vous arrêtez de taper, en même temps que l’aperçu et le plan : elle ne coûte rien pendant la frappe.

La fenêtre des couleurs

Ctrl+Maj+K, ou /colour dans un fichier markdown, l’ouvre. Il se lit de haut en bas, et c’est tout son principe — choisir une couleur à peu près en haut, l’affiner en bas :

La couleur Un bandeau assez large pour comparer un gris à un autre
Le code #6366F0, dans lequel vous pouvez taper si vous partez d’un code. Insérer, à côté, écrit la couleur au curseur
Dernières utilisées Les couleurs que vous avez insérées récemment, de la plus récente à la plus ancienne
Dans ce fichier Les couleurs déjà présentes dans le fichier ouvert
La grille Neuf familles de onze nuances, avec les gris en haut
Quatre curseurs Teinte, saturation, luminosité et opacité, chacun avec son dégradé sous la poignée et sa valeur à droite

Quand un tableau blanc est au premier plan, Insérer colore sa sélection au lieu d’écrire un code : un tableau n’a pas de curseur, et JSON Canvas accepte n’importe quel #rrvvbb.

Un clic sur n’importe quelle pastille la charge partout — le bandeau, le code et les quatre curseurs s’y placent — et un double-clic l’insère. Rien d’autre n’écrit dans votre document : un clic ne présente donc aucun risque, et les curseurs ajustent ensuite ce qu’il a chargé.

L’opacité s’ouvre verrouillée à 100, avec un cadenas à côté. Une couleur choisie dans un panneau est presque toujours voulue opaque, et une couleur transparente donne un code dont on ne voit pas l’intérêt — #6366F000 ressemble à une erreur plutôt qu’à un choix. Ouvrez le cadenas et le curseur se débloque ; le code s’allonge alors de deux chiffres pour devenir #rrggbbaa, et c’est la seule chose qui l’allonge jamais. C’est aussi pourquoi il n’y a pas de choix de format : il n’y a rien entre quoi choisir.

Les dernières couleurs utilisées sont mémorisées par projet, dans le fichier qui mémorise aussi les onglets ouverts : les couleurs de ce que vous êtes en train de créer reviennent le lendemain, sans se mélanger à celles d’un autre projet. Un fichier ouvert seul, sans dossier, n’a pas de projet où les mémoriser, et la liste commence vide.

Dans ce fichier est la partie la plus utile : la question habituelle n’est pas « quelle couleur inventer », mais « quel était ce bleu utilisé en haut ».

C’est une fenêtre à part (colour_as = "window"), que vous pouvez garder à côté d’une feuille de style : Insérer écrit toujours au curseur du fichier depuis lequel vous l’avez ouverte. Elle s’ouvre au-dessus de la fenêtre de l’éditeur et Échap la ferme. colour_as = "pane" l’ancre plutôt, en panneau à part entière et non en section du panneau markdown — une feuille de style est précisément l’endroit où l’on choisit une couleur, et le panneau markdown n’y est pas proposé ; tout le panneau défile, si bien que même étroit il montre tout. show_colour met son icône dans le rail et colour_side choisit le bord ; Ctrl+Maj+K l’ouvre dans les deux cas.

Caractères et émojis

La fenêtre des caractères, sur les émojis
La fenêtre des caractères, sur les émojis

Ctrl+Maj+Y (Fichier › Caractères et symboles) ouvre tous les caractères qu’on ne peut pas taper : flèches, maths, monnaies, typographie, émojis et entités HTML. Cherchez par nom — les symboles en français ou en anglais, les émojis en anglais — et cliquez pour insérer. Les derniers utilisés viennent en premier.

  • Symboles et Émojis insèrent le caractère lui-même (→, 🌱) ; Entités insère son nom HTML (&rarr;), que tout lecteur markdown retransforme en caractère.
  • Réglages : characters_as = "window" ou "pane", characters_side.

Dans la palette et dans la fenêtre

Les caractères absents du clavier — flèches, tirets, guillemets, ©, ½, π, et tous les émojis — sont accessibles à deux endroits qui partagent un même catalogue.

Dans la palette, de trois façons :

  • Par leur nom : /flèche, /smile, /copyright. Trois lettres au moins ; les caractères viennent après les entrées propres de la palette, huit au plus, pour ne jamais faire descendre l’entrée que vous visiez.
  • Par catégorie : /emoji, /symbole, /entit — cette catégorie, les plus récemment utilisés en premier. La première entrée de /emoji et de /symbole est Émojis… ou Symboles…, qui ouvre les caractères — sur Tous, comme Tous les caractères… : le mot sert à trouver l’entrée, pas à filtrer.
  • En parcourant : Caractères › montre les plus récents, puis Tous les caractères…, Symboles… et Émojis….

Le panneau des caractères, derrière le visage souriant du rail — à droite par défaut, réglages show_characters et characters_side —, les contient tous, dans n’importe quel fichier, code compris : un champ de recherche, une rangée de catégories — Tous, Symboles, Émojis, Entités —, les trente derniers utilisés, puis tout ce que trouve la recherche. Un clic écrit le caractère au curseur, en remplaçant la sélection ; son nom figure dans son infobulle.

Ou dans sa propre fenêtre : characters_as = "window" dans vos réglages. La même icône et les mêmes entrées de la palette l’ouvrent, et elle reste ouverte à côté de votre texte pendant que vous écrivez ; un clic écrit toujours au curseur du document depuis lequel vous l’avez ouverte. Elle s’ouvre au-dessus de la fenêtre de l’éditeur, Échap la ferme, et elle se ferme avec cette fenêtre. Son icône dans le rail est facultative : show_characters = false la retire, et la palette ouvre toujours la fenêtre.

Ce qu’écrit chaque catégorie :

Symboles le caractère lui-même — →, ©, ½. Il fonctionne partout, dans tous les programmes qui ouvrent le fichier
Entités les mêmes symboles sous leur nom HTML — &rarr;, &copy;. Ils donnent le caractère dans toutes les vues et dans un export, et le fichier reste en ASCII pur
Émojis l’émoji lui-même, tiré de la liste complète d’Unicode

Les trente derniers utilisés sont gardés par projet ; la liste commence remplie de classiques — →, …, —, «, », ©, ✓, 👍, 🎉, etc. — pour être utile dès la première fois, et chaque caractère utilisé en fait sortir un par la fin.

Les symboles et les entités portent un nom dans votre langue et se trouvent aussi par leur nom anglais et leur nom d’entité (rarr). Les émojis n’ont qu’un nom anglais, car c’est la seule langue dans laquelle les noms Unicode sont fournis ici. L’éditeur les dessine avec le premier glyphe que proposent les polices du système, parfois un simple contour plutôt que l’image en couleur ; ce qui est écrit dans le fichier, c’est l’émoji lui-même, et tout ce qui affiche les émojis en couleur l’affichera ainsi.

Les codes :smile: ne sont pas pris en charge : ce n’est pas du markdown, et rien de ce que cet éditeur affiche — ni la plupart des lecteurs de markdown — ne les transforme en image.

Coller depuis l’historique

Alt+V : les deux lignes copiées juste avant, la plus récente en premier
Alt+V : les deux lignes copiées juste avant, la plus récente en premier

Alt+V (Fichier › Édition › Coller depuis l’historique…) ouvre, au curseur, ce que vous avez copié ou coupé dernièrement dans cette fenêtre, le plus récent en premier. Les flèches pour choisir, Entrée pour coller, Échap pour fermer. Ce qui est dans le presse-papiers maintenant, copié depuis un autre programme, est en tête.

  • Gardé en mémoire seulement, jamais écrit sur le disque, perdu à la fermeture de la fenêtre.
  • Réglage : clipboard_history (20) — combien ; 0 le désactive.

Historique local

Chaque enregistrement conserve une version du fichier, sur cette machine et jamais dans le projet — rien à ajouter au .gitignore, rien dans git status. Fichier › Historique local les ouvre dans un onglet : les versions à gauche, de la plus récente à la plus ancienne, chacune avec son heure et sa taille ; celle que vous choisissez à droite, comparée côte à côte au fichier actuel. L’onglet s’ouvre sur la version la plus récente qui diffère du fichier, en général celle que vous cherchiez.

Restaurer cette version la rétablit : le fichier est réécrit et tout onglet qui l’affiche montre le changement. C’est refusé tant que cet onglet contient des modifications non enregistrées, car la restauration les effacerait. Une restauration est elle-même une version : elle peut donc être annulée depuis la même liste.

  • Un même texte enregistré deux fois n’est gardé qu’une fois : un enregistrement qui n’a rien changé n’ajoute pas de version.
  • Avant le premier enregistrement, le fichier tel qu’il était est aussi gardé — de même que toute modification qu’un autre programme y a écrite entre deux de vos enregistrements, datée du moment où elle a été écrite.
  • Les 50 dernières versions de chaque fichier sont gardées, aucune de plus de 30 jours — local_history_keep et local_history_days, où 0 signifie pas de limite de ce type. Les anciennes versions sont supprimées à l’ouverture d’un projet, même pour un fichier que personne n’enregistre plus.

Les versions se trouvent dans ~/.local/share/kaivalya-editor/history/, un dossier par fichier avec son chemin écrit à l’intérieur, chaque version étant un fichier texte ordinaire, lisible avec n’importe quel outil.

local_history = true      # false : aucune version n'est gardée
local_history_keep = 50
local_history_days = 30

Coller une capture d’écran

Copiez une capture d’écran, puis appuyez sur Ctrl+Alt+V (Fichier › Coller une image) dans un document markdown enregistré. L’image est écrite, dans le format du presse-papiers, dans un dossier images/ à côté du document, et un lien vers elle est inséré au curseur. Un fichier image glissé sur le texte est lié de la même façon. Voir Coller une capture d’écran.

  • Réglage : paste_image_folder ("images" ; vide, l’image est écrite à côté du document).
  • Un nouveau document doit d’abord être enregistré : il n’a pas encore d’« à côté ».

Liens vers d’autres fichiers

Tapez [[ pour un wikilien ou ]( après le texte d’un lien, et les fichiers à côté du document sont proposés au fil de la frappe ; le lien, une fois écrit, est suivi comme décrit plus bas.

Compléter un nom de fichier

L’autre moitié de la même idée, sans / cette fois : tapez [[ ou ]( et le contenu du dossier de votre document vous est proposé sous le curseur — une complétion de chemin, comme la touche Tab dans un terminal, et non une recherche.

Voir [x](./          → profond/
                       notes.md
                       ecrire.md

Ce que vous tapez jusqu’à la dernière / désigne un dossier, à partir du dossier de votre document ; ce qui suit est le début d’un nom dans ce dossier. Ainsi, ./ liste le dossier du document, ../ celui du dessus, docs/ celui du dessous, et docs/no ce qui, dans docs/, commence par no, sans tenir compte des majuscules. Les dossiers viennent en premier, en gras et terminés par / ; un nom qui commence par un point n’est proposé qu’une fois le point tapé.

Les flèches parcourent la liste — huit lignes à la fois, avec votre position dans un dossier plus long à côté de la ligne en surbrillance —, Entrée ou Tab écrit, Échap ferme la liste : les mêmes touches que la palette, puisque c’est le même geste. Choisir un dossier y entre — son nom et une / sont écrits et la liste affiche son contenu —, et choisir un fichier termine le lien.

Depuis docs/ecrire.md :

Vous tapez Résultat
[[no [[notes]] — à côté de ce fichier. Le .md du markdown est omis dans un lien wiki
[[profond/en [[profond/enfoui]] — un dossier plus bas
[le lisez-moi](../rea [le lisez-moi](../README.md) — un dossier plus haut ; une destination garde l’extension
[n]( puis Entrée sur notes.md [n](./notes.md) — ./ est la façon de dire à côté de ce fichier dans une destination
[p](./u [p](<./une image.png>) — un nom avec une espace doit être entre chevrons, sinon le lien s’arrêterait à l’espace

Un lien wiki reste sans ./ si vous n’en tapez pas : sans alias, il s’affiche avec son propre texte, et [[./notes]] ferait apparaître ces deux caractères dans la page. Un nom seul est d’abord cherché à côté du document : il trouve donc le même fichier.

La complétion termine le lien. Le ]] ou la ) de fermeture est écrit avec le nom, et le curseur se place après — sauf si la fermeture est déjà là, comme après l’entrée Lien vers un fichier de la palette : le curseur passe alors simplement par-dessus.

Fermer la liste, c’est la fermer pour de bon. Échap laisse ce que vous avez tapé, et la liste ne revient pas tant que vous finissez ce chemin : quelqu’un qui dit pas ça et continue à taper écrit un nom que le dossier n’a pas encore, précisément le moment où la liste des noms existants gêne. Le lien suivant la proposera de nouveau.

Uniquement dans les documents markdown. Un document jamais enregistré n’a pas de dossier : c’est la racine du projet qui est listée ; sans projet non plus, rien ne l’est.

Un lien qui crée sa page

/blink (ou /backlink, /new page) écrit []() et complète entre les parenthèses comme pour n’importe quel lien, avec une entrée de plus : quand le nom tapé ne correspond encore à aucun fichier, Créer nom.md est proposé en dernier. Le choisir crée le fichier, avec le nom pour titre, et termine le lien — un lien markdown ordinaire, que tout moteur de rendu suit, avec pour texte le nom de la page. Tant que des fichiers existants correspondent, ils viennent en premier : Entrée prend toujours celui qui existe ; dès que plus rien ne correspond, la nouvelle page est la seule entrée et Entrée la crée.

Vous tapez, après /blink Résultat
Idée, puis Entrée sur Créer Idée.md crée Idée.md à côté de ce document, écrit [Idée](Idée.md)
docs/Plan crée docs/Plan.md — dans un dossier existant ; aucun dossier n’est créé en chemin
no, alors que notes.md existe propose notes.md d’abord, puis Créer no.md ; choisir notes.md écrit [notes](notes.md)
grande idée écrit [grande idée](<grande idée.md>) — un chemin avec une espace est mis entre <>, comme le veut markdown

Un simple []( ne propose jamais de créer quoi que ce soit : Entrée sur un nom à moitié tapé ne doit pas laisser derrière lui un fichier que vous n’avez pas demandé. Si le fichier ne peut pas être créé — un dossier où vous n’avez pas le droit d’écrire —, le lien reste tel que vous l’avez tapé et l’éditeur explique pourquoi.

Faire un lien vers une autre note

Voir [[Une note]], ou [[Une note|appelez-la comme vous voulez]],
ou allez directement à un titre avec [[Une note#La configuration]].

L’éditeur trouve le fichier : vous écrivez le nom, pas le chemin. D’abord à côté du document, puis à partir de la racine du projet, puis n’importe où dans le projet par son nom — et si deux fichiers portent le même nom, c’est le plus proche du document qui l’emporte. Un nom sans extension désigne un fichier markdown : c’est ce qui fait de [[Une note]] l’écriture courante.

Un clic sur le lien ouvre la note, dans un onglet, le curseur sur le titre désigné. Il en va de même pour un lien relatif ordinaire, [une note](notes/une note.md) : un lien vers un fichier accessible depuis le document est pris en charge par l’éditeur, tout le reste — https:, mailto: — est confié à votre bureau.

Un nom qui ne correspond à rien garde ses crochets. [[Note inexistante]] est affiché tel que vous l’avez tapé, plutôt que comme un lien qui ne mène nulle part : une faute de frappe se voit.

Une inclusion est le même lien précédé d’un !. Une image est affichée à cet endroit, un document markdown est inséré dans la page, et tout le reste — un PDF, un fichier illisible pour l’éditeur — est affiché comme un lien.

Un document n’est inséré que là où une page est construite : dans l’aperçu complet et dans les deux exports. Votre fichier garde son ![[…]], et l’aperçu à côté du texte affiche le lien, comme toujours. C’est voulu : l’aperçu en direct est redessiné après chaque frappe, et ouvrir des fichiers à ce moment-là lui ferait perdre sa rapidité.

À l’insertion, les titres du document inclus sont décalés du niveau du titre sous lequel se trouve l’inclusion — sous un ##, son # devient un ### —, tous de la même quantité, pour que le fichier garde sa structure. Son en-tête est omis, et un document qui s’inclurait lui-même, directement ou par l’intermédiaire d’un autre, affiche une ligne qui le signale au lieu de tourner en rond indéfiniment.

Votre projet

Jusqu’ici, l’éditeur contenait un fichier. Désormais, il contient un projet : un dossier, les fichiers qu’il renferme, et ceux que vous aviez ouverts la dernière fois que vous l’avez fermé.

Ouvrir un dossier

Projet › Ouvrir un dossier… permet d’en choisir un. Tout le reste en découle — l’explorateur, la recherche d’un fichier par son nom, et ce que vous retrouvez à la prochaine ouverture.

Ce n’est pas obligatoire. Lancé sur un fichier, l’éditeur prend le dossier qui le contient et l’affiche : kaivalya-editor src/main.rs vous montre src/ dans l’explorateur sans rien demander. La différence entre les deux mérite d’être connue : c’est le dossier que vous ouvrez dont les fichiers sont mémorisés. Pas celui qui est simplement déduit d’un fichier : ouvrir un fichier qui se trouve quelque part n’est pas une déclaration sur ce dossier, et une fenêtre qui se mettrait à mémoriser pour cette raison remplacerait la liste de tout ce que vous aviez ouvert par le seul fichier sur lequel vous avez double-cliqué.

L’explorateur

L’explorateur s’ouvre à gauche et liste le contenu du projet dossier par dossier — un dossier n’est lu qu’au moment où vous l’ouvrez pour la première fois, si bien qu’un projet de cent mille fichiers ne coûte rien à ouvrir.

Les fichiers cachés sont affichés, et c’est voulu : .gitignore, .github/ et .env sont justement des fichiers pour lesquels cet éditeur est fait, et un éditeur qui les masque par défaut vous oblige d’abord à fouiller dans les réglages. Ce que .gitignore exclut n’est pas affiché, car vous n’avez pas ouvert le projet pour lire target/ ou node_modules/. Les deux comportements sont des réglages — show_hidden et use_gitignore. .git/ lui-même n’est jamais affiché, quel que soit le réglage.

Les deux peuvent être basculés pendant que vous regardez, c’est-à-dire au moment où la question se pose : Projet › Afficher les fichiers cachés (Ctrl+Maj+H) et Projet › Afficher les fichiers ignorés (Ctrl+Maj+G). Basculer ne relit pas le disque — le dossier a été lu entièrement, seul le filtre change —, et le changement s’applique aussi au sélecteur de fichiers : les deux ne se contredisent jamais sur le contenu du projet. Il dure le temps de la fenêtre ; le fichier de réglages décide de l’état d’une nouvelle fenêtre.

La recherche dans le projet est la seule exception : elle ne lit pas ce que .gitignore exclut, quels que soient ces réglages, car chercher dans un dossier de compilation produit du bruit, pas une réponse. Elle a son propre interrupteur — voir quels fichiers sont parcourus.

L’explorateur suit le disque. Un fichier créé par une compilation, un git checkout ou un autre éditeur apparaît sans que vous le demandiez ; un fichier supprimé disparaît.

Ctrl+Maj+E affiche et masque le panneau.

Le filtrer par nom

Le champ en haut de l’explorateur le filtre. Tapez une partie d’un nom : le panneau affiche les fichiers correspondants avec seulement les dossiers qui y mènent, dépliés — un dossier qui ne contient rien de correspondant n’est pas un dossier qui vous intéresse.

Il trouve des fichiers que l’arborescence n’a jamais lus. L’explorateur n’ouvre un dossier que lorsque vous le faites : filtrer ce qui est à l’écran ne trouverait que ce que vous aviez déjà ouvert. Ce filtre cherche donc dans tout le projet, dans la même liste que Ctrl+P, et de la même façon — sm trouve src/main.rs.

Cliquer sur un dossier dans le panneau filtré vous y emmène : le champ se vide et ce dossier s’ouvre dans l’arborescence. Vider le champ vous-même remet l’arborescence exactement comme elle était, dossiers repliés compris.

Favoris et récents

Quatre listes, rangées dans les menus :

Fichier › Fichiers favoris Les fichiers que vous avez marqués avec Fichier › Garder ce fichier en favoris. Ils y restent jusqu’à ce que vous les retiriez.
Fichier › Fichiers récents Les douze derniers fichiers ouverts.
Projet › Dossiers favoris Les dossiers que vous avez marqués avec Projet › Garder ce dossier en favoris.
Projet › Dossiers récents Les douze derniers dossiers ouverts.

Chaque ligne affiche le chemin complet : deux fichiers nommés README.md donnent deux lignes que l’on distingue. Cliquer sur un fichier l’ouvre ; cliquer sur un dossier ouvre ce projet, avec ce que vous y aviez ouvert. Une liste vide n’apparaît pas du tout.

Elles sont dans les menus plutôt que dans un panneau, car un menu suffit pour une liste consultée deux fois par jour : une colonne de la fenêtre vaut plus que cela, et elle revient à votre texte.

Projet est le premier menu, car la première chose que vous faites dans une séance est de choisir ce sur quoi vous travaillez, et seulement ensuite quel fichier. Quand un menu contient tout un sujet, ce sujet en devient un sous-menu — Édition, Tableau et Affichage sous Fichier, et ces quatre listes sous Fichier et Projet.

Les onglets et les fichiers ouverts

Chaque fichier ouvert a son onglet, le premier compris — c’est l’onglet qui nomme le fichier que vous lisez. Ouvrir un deuxième fichier le place dans un onglet, à côté du premier.

Document suivant, précédent Ctrl+Tab, Ctrl+Maj+Tab
Fermer ce document Ctrl+W
Les fermer tous Ctrl+Maj+W
Tous sauf celui-ci Ctrl+Alt+W

Un clic droit dans le texte permet aussi de copier le chemin complet du fichier ou son nom, comme le menu d’une ligne de l’explorateur.

Les quatre commandes qui ferment plusieurs documents se trouvent dans Projet › Fermer plusieurs, et toutes sont accessibles par un clic droit dans le texte — là où se trouve déjà votre main. Le menu ne propose que ce qu’il y a à fermer : avec un seul fichier ouvert, il propose de fermer ce fichier et rien sur les autres.

Rien de ce qui contient des modifications non enregistrées n’est jamais fermé sans vous le demander — ni en fermant un onglet, ni en fermant la fenêtre.

Un fichier modifié par un autre programme s’affiche tel qu’il est désormais, dans son onglet, en moins d’une seconde — un git pull, un formateur, un autre éditeur. Le curseur reste sur sa ligne ; l’annulation repart du nouveau texte. Un onglet avec des modifications non enregistrées les garde : la barre d’état signale que le fichier a changé en dessous, et enregistrer écrit votre version par-dessus la sienne. Cela vaut pour les fichiers du projet ouvert, le dossier que l’éditeur surveille.

Les fichiers ouverts forment aussi un panneau, à gauche à côté de l’explorateur : une ligne par document, nommée comme son onglet, avec le chemin complet en dessous, le document actif mis en évidence et un point sur celui qui contient des modifications non enregistrées. Un clic y mène, la croix le ferme. Contrairement à la barre d’onglets, il ne manque jamais de place, et il est là même avec un seul document.

Le bouton qui les liste se trouve à l’extrémité droite de la barre d’onglets, et open_files_button peut le placer à gauche, aux deux extrémités, ou nulle part :

show_files = true               # le panneau ; false le retire
files_side = "left"             # ou "right"
open_files_button = "right"     # "left", "right", "both" ou "none"

Une question prend le clavier. Entrée appuie sur le premier bouton, celui qui conserve votre travail — Enregistrer ici, Réinitialiser dans les réglages, Remplacer dans la recherche. Échap correspond à Annuler. Les flèches et Tab atteignent les boutons intermédiaires, et la rangée ne boucle pas : dépasser Enregistrer ne doit pas mener à Ne pas enregistrer.

Trouver un fichier par son nom

Ctrl+P avec une lettre tapée
Ctrl+P avec une lettre tapée

Ctrl+P, puis tapez n’importe quelle partie du nom. Pas besoin de la taper d’un seul tenant : sm trouve src/main.rs, et une majuscule signifie que vous la voulez, si bien que readme trouve README.md alors que README cherche exactement cette graphie.

Les flèches se déplacent, Entrée ouvre. Échap efface votre saisie, et un second Échap ferme ; un nouveau Ctrl+P ferme d’un coup, quel que soit le contenu du champ.

Le projet est lu la première fois que vous le demandez — pas à l’ouverture du dossier — puis tenu à jour : le premier Ctrl+P dans un gros projet prend un instant, les suivants sont immédiats. Un projet trop grand pour être listé entièrement le signale, au lieu de ne pas trouver des fichiers en silence.

Rechercher et remplacer dans le projet

Toutes les lignes du projet qui contiennent « beans »
Toutes les lignes du projet qui contiennent « beans »

Ctrl+Maj+F ouvre la recherche et place le curseur dans son champ. Tapez : les résultats arrivent un instant après que vous vous arrêtez.

Un résultat est une ligne. Le chemin du fichier sert de titre, et les lignes en dessous sont ce sur quoi vous cliquez ; chacune porte son numéro de ligne et la ligne elle-même, avec la partie trouvée mise en évidence. Le titre indique le nombre d’occurrences dans ce fichier, et un clic dessus les replie — un fichier bruyant mis de côté sans changer la recherche. Le bouton au bout des options replie tous les fichiers, et les déplie quand ils sont tous repliés.

Un repli appartient au fichier, pas à la liste : affinez la recherche, et un fichier que vous aviez replié revient replié — c’est toute la raison d’en replier un. Cliquer sur une ligne ouvre le fichier avec le curseur sur l’occurrence — pas en début de ligne, pour ne pas avoir à la chercher deux fois. Si vous lisiez un document mis en forme, le texte revient à côté : un aperçu n’a pas de lignes où se poser.

Trois options sous le champ :

Aa Respecter la casse. Désactivé ne veut pas dire « ignorer la casse », mais casse intelligente : la recherche ignore la casse jusqu’à ce que vous tapiez une majuscule, et la respecte ensuite.
\b Mot entier. cat ne trouve plus catalogue.
.* Expression régulière. Désactivé, le motif est pris littéralement : chercher a.b trouve a.b, pas axb.

Un motif qui n’est pas une expression régulière valide le signale, avec les mots du moteur, au lieu de ne rien trouver sans explication.

Quels fichiers sont parcourus

Le chevron au bout des options ouvre trois autres réglages, qui répondent à « où » plutôt qu’à « quoi » :

Fichiers à inclure Seuls ceux-ci sont parcourus. *.rs, docs, **/api/** — séparés par des virgules.
Fichiers à exclure Ceux-ci ne le sont pas, quoi qu’en dise l’inclusion.
ignorés Parcourir aussi les fichiers exclus par .gitignore. Désactivé par défaut.

Les motifs sont ceux que vous écrivez déjà dans un .gitignore : *.md s’applique à toute profondeur, docs/** depuis la racine du projet, et un nom seul désigne le dossier et tout son contenu — docs et vendor font ce que vous attendez, au lieu de ne correspondre qu’au dossier sans aucun de ses fichiers. Un motif invalide le signale avec les mots de l’analyseur, comme une expression régulière invalide.

Ces filtres élaguent le parcours au lieu de trier les résultats : exclure target rend une recherche plus rapide, et pas seulement plus courte. Rien de tout cela n’est mémorisé : fermez l’éditeur et les champs sont de nouveau vides, comme la recherche elle-même.

Par défaut, la recherche ne lit pas ce que .gitignore exclut — même quand l’explorateur l’affiche. C’est une différence voulue entre les deux, et la seule : l’explorateur répond à « que contient ce dossier », et chercher dans un dossier de compilation, ce sont des dizaines de milliers de fichiers que vous ne modifierez jamais et des résultats dont vous ne pouvez rien faire. L’option ignorés permet d’en décider autrement pour une recherche, et une recherche qui revient vide indique qu’elle ne les a pas lus : un fichier que vous voyez mais ne trouvez pas n’est jamais un mystère.

Pour le reste, la recherche regarde là où regarde l’explorateur — les fichiers cachés oui, .git/ jamais. Les fichiers qui ne sont pas du texte sont ignorés, de même que tout fichier de plus de 16 Mo ; si c’est arrivé, la ligne d’état indique combien.

Les résultats très volumineux sont tronqués plutôt que conservés : à mille fichiers, ou cent occurrences dans un fichier, ou quatre cents caractères d’une ligne, la recherche indique qu’elle ne montre qu’une partie de ce qu’elle a trouvé.

Remplacer

Le chevron à côté du champ ouvre une ligne de remplacement : la même recherche, une ligne plus bas, avec Tout remplacer à côté.

Ce qui est dans la liste est ce qui change. Les résultats servent d’aperçu — chaque fichier, chaque ligne —, et le remplacement ne porte que sur eux et n’ouvre rien d’autre : un fichier créé depuis la recherche n’est pas touché. Il demande d’abord confirmation, avec le nombre de remplacements, et la liste reste visible derrière la question.

Trois choses qu’il ne fait pas :

  • Il n’écrit pas dans un fichier qui contient des modifications non enregistrées. Ces fichiers sont laissés de côté et comptés dans le bilan affiché ensuite ; enregistrez-les d’abord si vous voulez qu’ils soient concernés.
  • Il n’utilise pas de positions périmées. Chaque fichier est recherché de nouveau au moment de l’écriture : un fichier modifié entre la recherche et le remplacement est soit remplacé correctement, soit ignoré et signalé — jamais corrompu.
  • Il ne laisse jamais un fichier à moitié écrit. Le nouveau texte est écrit à côté de l’ancien puis renommé par-dessus, en conservant les permissions de l’original.

Les fichiers que vous aviez ouverts sont relus, pour que rien à l’écran n’affiche un texte que le fichier ne contient plus, et la recherche est relancée — chaque ligne de l’ancienne liste venait de devenir fausse.

Avec une expression régulière, le remplacement peut utiliser ses groupes : $1 est le premier. Avec une recherche littérale, le remplacement l’est aussi : $1, ce sont deux caractères.

Le plan

Ctrl+Maj+O (Fichier › Affichage › Plan) montre les titres d’un fichier markdown, ou les définitions d’un fichier de code (fonctions, types, impl…), imbriqués. Cliquez pour y aller. Réglages : show_outline, outline_side.

Le plan d’un fichier de code

Le panneau du plan liste les définitions d’un fichier de code, imbriquées comme elles sont écrites : une structure, l’impl qui la suit et les fonctions qu’il contient — en Rust, Python, JavaScript, TypeScript, Go, Java, PHP et shell, mais aussi les règles d’une feuille de style et les tables d’un fichier TOML. Chaque ligne reprend le texte du source, pub fn outline ou class Reader, et un clic mène à sa ligne, comme un titre en markdown. F6 permet de le parcourir au clavier de la même façon.

La barre de défilement porte les mêmes repères : une marque pour chaque titre ou définition de premier niveau et, en rouge, pour chaque ligne TODO du fichier — vous voyez où ils se trouvent sans ouvrir de panneau. Ces marques viennent de ce que le plan et le panneau TODO ont déjà lu, jamais d’une seconde lecture du fichier ; la barre de défilement reçoit toujours vos clics. scrollbar_marks = false les supprime.

La table des matières

Fichier › Générer ou mettre à jour la table des matières écrit au curseur une liste de liens vers les titres du document, entre deux marqueurs ; relancée n’importe où, la liste est remplacée là où elle est. Réglage : toc_max_level — le niveau de titre le plus profond inclus.

Rétroliens

La section Rétroliens du panneau markdown liste tous les autres fichiers markdown du projet qui renvoient vers celui-ci — par lien wiki, inclusion, lien ordinaire ou image, avec ou sans .md, depuis le dossier du fichier ou depuis la racine du projet (/docs/notes.md), ou par un <a href> HTML —, résolus comme le serait un clic, avec la ligne où se trouve chaque lien. Un chemin simplement écrit dans le texte, entre accents graves ou non, n’est pas un lien et n’est pas compté. Un clic ouvre le fichier à cette ligne. La recherche a lieu à l’ouverture de la section, puis à chaque changement de document ou enregistrement ; elle n’écrit rien. Les fichiers exclus par votre .gitignore ne sont pas parcourus.

Pour garder la liste dans le fichier, utilisez Générer ou mettre à jour les rétroliens (dans la même section, ou dans la liste des commandes). La première fois, un bloc est écrit au curseur ; ensuite, il est remplacé où qu’il se trouve, comme la table des matières :

<!-- mentions -->

**Rétroliens**

- [index](../index.md): `Voir [[Notes]] pour en savoir plus.`
<!-- /mentions -->

Chaque phrase est citée dans une portion de code, pour qu’un lien qu’elle contient ne soit pas compté, la fois suivante, comme une mention d’autre chose. Rien ne met le bloc à jour tout seul : il change quand vous le demandez, et le fichier reste le vôtre.

Le panneau TODO et le tableau des tâches

Le panneau TODO : le todo.md du projet, puis ce qui a été trouvé dans le code
Le panneau TODO : le todo.md du projet, puis ce qui a été trouvé dans le code
Le tableau des tâches : todo.md en colonnes
Le tableau des tâches : todo.md en colonnes

Le panneau TODO liste chaque ligne du projet qui porte une étiquette — TODO et FIXME, sauf avis contraire — dans n’importe quel type de fichier : un // TODO en Rust, un - FIXME en markdown, un /* TODO */ dans une feuille de style. Regroupées par fichier, avec le numéro de ligne à gauche ; un clic mène à la ligne.

show_todo = true
todo_side = "left"               # ou "right"
todo_tags = ["TODO", "FIXME"]    # ajoutez "XXX", "HACK", "NOTE"… à votre guise

Mes tâches viennent en premier : le todo.md du projet, à sa racine, lu comme le lisent les extensions kanban — chaque titre ## est une colonne, chaque élément de liste en dessous une carte, - [ ] à faire et - [x] fait :

## À faire
- [ ] écrire les notes de version

## En cours
- [ ] le tableau

## Fait
- [x] le panneau TODO

Chaque colonne est un titre dans le panneau, déplié tant que vous ne le repliez pas, avec le nombre de cartes à faire ; la case d’une carte la coche dans todo.md, et un clic mène à sa ligne. Un projet qui n’en a pas affiche Créer un todo.md pour ce projet, qui écrit ces trois colonnes et ouvre le fichier. todo.md est alors exclu de ce qui est trouvé dans le code ci-dessous, pour que rien ne soit listé deux fois.

Le tableau des tâches — Tableau des tâches à côté de Mes tâches, ou Projet › Le tableau des tâches (todo.md) — présente todo.md en colonnes de cartes dans un onglet. Faites glisser une carte vers une autre colonne et sa ligne s’y déplace dans le fichier, avec les lignes indentées en dessous ; la case la coche, un clic l’ouvre à sa ligne. Déplacer une carte dans Fait ne la coche pas, comme dans les extensions dont il s’inspire : c’est la case qui fait foi. Un déplacement, ou une carte ajoutée avec le + d’une colonne, est enregistré aussitôt — dans l’onglet de todo.md s’il est ouvert, en une seule étape d’annulation. Le fichier reste la référence — modifiez-le à la main et le tableau suit.

Le texte d’une carte est du markdown — **gras**, `code`, un lien —, dessiné comme le dessine l’aperçu, sur le tableau comme dans Mes tâches. Les tâches indentées sous une carte sont ses sous-tâches, sur un niveau, comme sur GitHub :

## En cours
- [ ] la version
  - [x] les notes
  - [ ] l'étiquette

La carte montre combien sont faites, ▸ 1/2, repliées ; un clic sur ce compte les déplie en liste de cases sur la carte, et un autre les replie. Là, une case coche une sous-tâche dans todo.md — la carte elle-même ne se coche que par sa propre case — et un clic mène à sa ligne. Une carte qu’on fait glisser emporte ses sous-tâches. Une sous-tâche indentée plus profondément encore compte dans la même liste ; une ligne vide la termine.

→ déplace une ligne étiquetée dans Mes tâches : elle devient une carte à la fin de la première colonne, - [ ] ranger (src/main.rs:12), et quitte son fichier — le commentaire, et la ligne entière si elle ne contenait rien d’autre. Une ligne avec du code avant son commentaire garde le code : let x = 1; // TODO: ranger devient let x = 1;. Chaque fichier est modifié dans son onglet s’il est ouvert, pour que vous puissiez annuler, et une ligne qui a changé depuis le dernier passage du panneau n’est pas déplacée.

Une étiquette est un mot entier, tel qu’écrit : TODO trouve TODO: et TODO(ana), mais pas todo dans une phrase, ni TODOS, ni MASTODON. Une ligne avec deux étiquettes n’apparaît qu’une fois.

Les lignes sont regroupées par mot-clé, puis par fichier : un titre par mot-clé avec son total — TODO 12, FIXME 3, dans l’ordre de todo_tags —, puis, sous un mot-clé déplié, un titre par fichier avec son propre total, puis les lignes. Les mots-clés sont repliés au départ : le panneau s’ouvre comme un bref résumé ; cliquez sur l’un d’eux pour le déplier. Une ligne avec deux mots-clés, TODO and FIXME, apparaît une fois, sous le premier de la ligne. Le titre d’un fichier replie ses lignes sous ce mot-clé seulement, et le bouton à côté du total d’un mot-clé déplié replie tous ses fichiers d’un coup, ou les déplie de nouveau. Le bouton à côté d’Actualiser déplie tout — ou, quand tout est déplié, replie tous les mots-clés. Le total en haut compte toujours toutes les lignes, dépliées ou non, et ce que vous aviez déplié revient avec le projet.

Les cases non cochées y figurent aussi, sous Listes de tâches, après les mots-clés : chaque - [ ] (ou * [ ], + [ ], 1. [ ]) en début de ligne dans un fichier markdown. Un [x] coché est fait et n’apparaît pas ; un [ ] au milieu d’une phrase, ou dans un fichier de code, n’est pas une tâche. Elles dépendent des mots-clés : avec todo_tags vide, le panneau ne cherche rien. Cochez-en une depuis le panneau, avec la case en début de ligne : la coche est écrite dans son fichier — dans son onglet, annulable, si le fichier est ouvert — et la tâche quitte la liste. Une ligne qui a changé depuis le dernier passage du panneau n’est pas cochée, et la barre d’état le signale. Le reste de la ligne mène toujours à la ligne du fichier.

Le panneau utilise le même parcours que la recherche dans le projet : il regarde là où regarde l’explorateur — un target/ exclu par .gitignore est ignoré, sauf s’il est affiché — et il ne parcourt le projet que lorsqu’il est à l’écran : à son ouverture, puis après chaque écriture d’un fichier du projet. Actualiser, en haut, sert pour un changement que l’éditeur n’a pas pu voir.

La note du jour et les modèles

La note du jour

Fichier › Nouveau › La note du jour, ou Ctrl+Maj+J, crée AAAA-MM-JJ.md dans le dossier indiqué par daily_note_folder — journal par défaut — et l’ouvre. Si daily_note_template désigne l’un de vos modèles — jdr/journal pour un modèle rangé dans un dossier —, la note part de ce modèle, avec pour {{title}} la date de la note. journal.md est fourni à cet effet, dans le dossier des modèles à côté de vos réglages, et c’est lui qui est utilisé par défaut : le jour en titre, puis Notes, À faire et Fait, le curseur sous Notes. Modifiez-le là — il est à vous, et n’est jamais réécrit.

Elle n’écrase jamais rien. Redemandée le même jour, elle ouvre la note déjà créée : vous pouvez donc y recourir par réflexe, sans risque.

Vos propres modèles

Un fichier placé dans .kaivalya/templates/ de votre projet, ou dans templates/ à côté de vos réglages, devient une entrée de la palette. Les deux dossiers sont relus à chaque ouverture de la palette : un modèle écrit il y a cinq minutes y est déjà.

.kaivalya/templates/
  reunion.md            → /reunion
  bilan hebdomadaire.md → /bilan, /hebdomadaire

Le nom du fichier sans .md est le nom de l’entrée et ce que vous tapez pour la trouver — un modèle porte un nom à vous, il n’est donc pas traduit. Le groupe n’apparaît que s’il contient quelque chose, et chaque entrée indique si elle vient du projet ou de votre propre dossier. À nom égal, c’est celle du projet qui l’emporte : un projet qui apporte son propre reunion veut le sien.

Les dossiers deviennent des groupes. Rangez vos modèles dans des dossiers, aussi profonds que vous le souhaitez, et la palette ouvre chaque dossier comme elle ouvre un de ses propres groupes :

templates/
  jdr/
    shadowrun/pj.md   → Modèles › jdr › shadowrun › pj
    l5r/pj.md         → Modèles › jdr › l5r › pj

Échap, ou l’entrée du haut, remonte d’un dossier. La saisie cherche toujours dans tous les modèles à la fois, où qu’ils soient rangés : /pj propose les deux, chacun avec son dossier à droite, et le nom d’un dossier atteint ce qu’il contient — /shadow propose ceux de Shadowrun. Un dossier dont le nom commence par un point n’est pas lu, et la lecture s’arrête à huit niveaux de profondeur.

Quatre marqueurs sont remplacés à l’insertion :

{{date}} La date du jour, sous la forme 2026-09-23
{{time}} L’heure, sous la forme 14:32
{{title}} Le nom du fichier du document, sans son extension
{{cursor}} L’endroit où placer le curseur. Sans lui, il se place à la fin

Tout le reste est laissé exactement tel que vous l’avez écrit — {{ .Site.Title }}, une {{coquille}}, un {{ jamais refermé. Votre modèle peut parler de modèles, et un éditeur qui avalerait ce qu’il ne reconnaît pas serait inutilisable pour en écrire un.

Un modèle peut tenir en une ligne, et deux modèles fournis sont ainsi. Au premier lancement, name.md et mail.md sont placés dans templates/ à côté de vos réglages, avec Toto Titi et titi@toto.corp : remplacez-les par votre nom et votre adresse, et /name et /mail les écriront dans tous vos projets. C’est tout ce qu’aurait été une fonction « insérer mon nom », et vous pouvez la modifier sans rien demander à personne.

Ils ne sont écrits qu’une seule fois. Une feuille de style fournie avec l’éditeur est réécrite à chaque démarrage, parce qu’elle appartient à l’éditeur ; ces modèles, eux, sont faits pour être modifiés : un modèle déjà présent est laissé tel quel. Supprimez-en un et il revient au démarrage suivant — videz-le plutôt si vous ne voulez plus le voir. Les originaux se trouvent dans resources/templates/ dans les sources.

  • Réglages : daily_note_folder ("journal"), daily_note_template ("journal").

Les réglages propres à un projet

Projet › Réglages du projet ouvre le settings.toml propre au projet, dans son dossier .kaivalya/, et le crée s’il n’existe pas. N’y écrivez que ce que ce projet change, avec les mêmes noms et valeurs que dans votre propre fichier de réglages — qui les explique tous :

# .kaivalya/settings.toml
todo_tags = ["TODO", "FIXME", "NOTE"]
tab_size = 2
soft_wrap = false

Chaque option est d’abord cherchée là, puis dans vos réglages, puis dans les valeurs par défaut de l’éditeur : une option ajoutée dans une version ultérieure ne demande jamais de mettre ce fichier à jour. Il s’applique à l’ouverture du projet et à l’enregistrement du fichier, et vos propres réglages reviennent quand vous ouvrez un autre projet. Un nom inconnu de l’éditeur est signalé dans la barre d’état, et le reste s’applique quand même ; un fichier illisible est signalé et laisse vos réglages intacts. Une largeur de tabulation s’applique aux documents ouverts ensuite ; le thème et les polices changent pour toute l’application.

Projet › Écrire le fichier du projet (.kaivalya/project.toml) écrit le fichier de règles du projet — la feuille de style par dossier, l’autocommit — avec chaque clé expliquée et commentée : il ne fait rien tant qu’aucune ligne n’est décommentée.

Atteindre un panneau sans la souris

F6 place le clavier dans le panneau à côté de votre texte ; un nouvel appui passe au panneau suivant, puis revient au texte. Maj+F6 fait le tour dans l’autre sens. Échap rend le clavier au texte, où que vous soyez.

Il s’arrête sur le panneau qu’affiche un bord, jamais sur une icône d’un rail : là où il n’y a rien à mettre en évidence, le clavier n’a rien à faire.

Une fois le clavier dans un panneau :

↑ ↓ Monter et descendre dans la liste, en bouclant aux deux extrémités
Origine Fin La première ligne, et la dernière
→ ← Dans l’explorateur, déplier un dossier puis le replier
Entrée Ouvrir l’élément en évidence — et le clavier vous suit, dans le texte. Dans les fichiers ouverts, aller à ce document

Il commence là où vous êtes, et c’est ce qui le rend utile : le plan s’ouvre sur le titre sous lequel se trouve votre curseur plutôt que sur le premier, l’explorateur et les fichiers ouverts sur le fichier ouvert. La recherche fait exception sans avoir besoin de règle : son champ est un champ de texte, le clavier y entre simplement.

Ce que vous retrouvez

Rouvrez un dossier dans lequel vous avez déjà travaillé, et l’éditeur remet les fichiers que vous aviez ouverts, celui qui était au premier plan, et la position du curseur dans chacun — ainsi que les sections dépliées du panneau markdown, et les mots-clés dépliés et fichiers repliés du panneau TODO. Le panneau markdown s’ouvre avec toutes ses sections repliées dans un dossier ouvert pour la première fois, et pour un fichier ouvert seul : ses titres forment une table des matières, et vous ouvrez celui qui vous intéresse.

Un fichier supprimé entre-temps est retiré sans un mot : qu’un projet évolue entre deux utilisations de l’éditeur, c’est normal, pas une erreur.

Rien de tout cela n’est écrit dans votre projet. Tout est rangé dans le dossier de données de l’éditeur : rien n’apparaît dans git status, et il n’y a rien à ajouter au .gitignore.

Plusieurs fenêtres

Éditeur › Nouvelle fenêtre, ou Ctrl+Maj+N, ouvre une autre fenêtre sur l’écran d’accueil, quel que soit le réglage on_open — le projet qu’elle reprendrait est déjà ouvert dans la première. Chaque fenêtre a son propre projet, ses propres onglets et ses propres panneaux. Un projet ouvert dans une fenêtre ne s’ouvre pas dans une seconde : le demander ramène au premier plan la fenêtre qui l’a, car deux fenêtres sur un même projet écriraient chacune ce qui y était ouvert, l’une par-dessus l’autre.

Quitter passe par toutes les fenêtres : chacune pose la question de ce qu’elle contient de non enregistré, comme si on la fermait, et l’éditeur s’arrête quand la dernière a accepté. Annulez dans l’une d’elles, et les fenêtres encore ouvertes le restent.

Git

Un projet qui est un dépôt git dispose d’un panneau Git, à gauche, derrière l’icône de branche du rail. Il est lu par gitoxide, à l’intérieur de l’éditeur : hormis la récupération, l’envoi, le rebasage et le changement ou la création de branche, rien ne passe par git. Tout le reste fonctionne donc de la même façon que git soit installé ou non, et quelle que soit la configuration de votre git pour la pagination ou les couleurs.

Le panneau git
Le panneau git

Ce qui a changé

L’en-tête du panneau indique la branche courante. En dessous, chaque fichier qui diffère du dernier commit, comme les liste git status --short :

A ajouté — un nouveau fichier, que git le connaisse déjà ou non
M modifié
D supprimé
R renommé
T type changé — un fichier devenu lien
U en conflit après une fusion

Un fichier déjà indexé avec git add porte la mention indexé à côté de son nom. Les fichiers ignorés ne sont pas listés. Le panneau relit le dépôt chaque fois qu’un fichier du projet est écrit — vos enregistrements compris —, et Actualiser le relit à la demande, pour un changement fait par un programme que l’éditeur n’a pas vu.

Sous Committer, une rangée de petits boutons, dont le nom s’affiche au survol ; seuls ceux qui ont un sens à ce moment sont affichés :

nuage, flèche vers le bas Récupérer — avec un dépôt distant
nuage, flèche vers le haut Pousser — avec un dépôt distant, sur une branche
flèche qui remonte Rebaser — quand la branche en suit une autre
une ligne qui se divise Graphe
horloge Historique
flèche circulaire Actualiser — présent même quand le dossier n’est pas un dépôt, pour un git init lancé dans un terminal

Le bouton d’une commande en cours prend la couleur d’accent, et son nom l’indique — Récupération… — jusqu’à la fin.

Les différences d’un fichier

Double-cliquez sur un fichier — ou atteignez-le avec F6 et appuyez sur Entrée — et ses modifications depuis le dernier commit s’ouvrent dans un onglet, à côté de vos fichiers : l’ancien texte à gauche, le nouveau à droite, chaque remplacement en face de ce qu’il remplace, trois lignes inchangées autour de chaque modification, et le numéro de chaque ligne. Unifié, en haut de l’onglet, les présente en une seule colonne, comme git diff. Redemander le même fichier ramène le même onglet au premier plan ; Ctrl+W le ferme.

Committer

Chaque fichier a une case, cochée au départ. Décochez ce qui ne doit pas partir, écrivez un message, cliquez sur Committer. C’est l’équivalent de git add sur les fichiers cochés, suivi de git commit -m avec votre message :

  • ce que vous aviez déjà indexé part aussi dans le commit, comme en ligne de commande ;
  • un fichier supprimé et coché est supprimé dans le commit ;
  • l’auteur est celui de votre configuration git, user.name et user.email — si aucun n’est défini, le commit est refusé et la barre d’état l’indique ;
  • un message vide est refusé, tout comme un commit qui ne changerait rien.

La barre d’état affiche l’identifiant court du nouveau commit. Un fichier contenant des modifications non enregistrées est commité tel qu’il est sur le disque, comme le ferait git add : enregistrez d’abord si c’est la version à l’écran que vous voulez.

Le message tient sur une ligne — un titre — et Entrée dans le champ lance le commit. Pour un commit avec un corps de message, passez par git commit.

Les branches

Le nom de la branche, en haut du panneau, ouvre un menu : toutes les branches locales, la branche courante cochée, et Nouvelle branche… en dessous.

  • Choisir une branche permet d’y passer : l’éditeur lance git switch. Les fichiers qui diffèrent entre les deux branches sont réécrits depuis la branche choisie ; vos modifications non commitées dans les autres fichiers vous suivent. Si l’une de vos modifications se trouve dans un fichier que le changement de branche écraserait — ou si un fichier non suivi occupe la place d’un fichier de la branche —, rien n’est écrit, et la barre d’état nomme les fichiers en cause : commitez-les ou annulez-les d’abord. L’éditeur vous demande aussi d’enregistrer ou de fermer tout document modifié avant de changer de branche, car le contenu d’un document ouvert est une version que le changement de branche ne peut pas voir. Les documents ouverts que le changement a réécrits sont relus ; ceux dont le fichier n’existe pas sur la branche sont fermés. Dans les deux cas, la ligne correspondante apparaît dans git reflog, comme depuis un terminal.
  • Nouvelle branche… ouvre un champ sous l’en-tête : tapez le nom puis Entrée. C’est git switch -c — une branche à l’endroit où vous êtes, sur laquelle vous passez —, donc rien ne change sur le disque et votre travail non commité reste intact. Un nom que git refuserait est refusé ici aussi, et le champ garde votre saisie.

L’historique

Historique ouvre dans un onglet les commits de la branche, du plus récent au plus ancien, les cinq cents derniers. Cliquez sur un commit et la moitié droite l’affiche en entier : son identifiant complet, l’auteur et son adresse, l’instant exact dans le fuseau horaire de l’auteur, la personne qui l’a commité si ce n’est pas la même ou pas au même moment, ses parents — deux pour une fusion —, son message complet et les fichiers modifiés. Double-cliquez sur l’un de ces fichiers pour voir, dans un onglet à part, ce que ce commit lui a fait par rapport au commit parent.

Le commit automatique

Un projet peut committer de lui-même les fichiers que vous enregistrez — pour un dossier de notes dont vous voulez garder l’historique sans y penser. Cela s’active dans le fichier du projet, .kaivalya/project.toml (les règles du projet), qui concerne le projet entier : un commit prend des fichiers de n’importe où dans le projet.

autocommit = 60           # secondes de calme après un enregistrement ; absent ou 0 : désactivé
autocommit_push = false   # seulement pour garder les commits en local ; absent ou true : pousser

Après un enregistrement, l’éditeur attend ce nombre de secondes sans autre enregistrement, puis commite les fichiers enregistrés entre-temps, avec leurs noms pour message — notes.md, todo.md. Chaque enregistrement relance l’attente. Un fichier qui n’a pas réellement changé est laissé de côté, de même qu’un fichier ignoré par git ; rien n’est commité pendant une fusion ou un rebasage en cours, et un fichier en conflit ne l’est jamais. Ce que vous aviez déjà indexé part aussi, comme avec Committer. L’éditeur pousse ensuite, avec votre git, comme Pousser — sauf si le fichier dit autocommit_push = false ; un envoi qui échoue est signalé dans la barre d’état, et le commit reste en attente du prochain envoi.

Quitter le projet n’attend pas la fin du calme. Fermez la fenêtre, quittez l’éditeur ou ouvrez un autre projet : ce que vous avez enregistré depuis le dernier commit est commité et poussé sur-le-champ, sans question. La fermeture attend cet envoi — un instant sur un réseau lent —, car une fenêtre disparue l’interromprait en cours de route ; un envoi qui échoue à ce moment-là est écrit dans le terminal, et le commit reste. Les fichiers non enregistrés sont toujours proposés d’abord, comme d’habitude, et ce que vous enregistrez en réponse part dans le même commit.

L’éditeur vous le demande d’abord, une fois par projet. Le dossier .kaivalya/ voyage avec le dépôt : sans cette question, le clone des notes de quelqu’un d’autre se mettrait à committer et pousser vos enregistrements sans que vous ayez jamais dit oui. Votre réponse est gardée sur cette machine, avec la session du projet — jamais dans le dépôt —, et elle vaut pour cette règle : si la règle change, une attente plus courte ou un envoi qui n’y était pas, la question est reposée. C’est d’ailleurs ainsi qu’on revient sur un Pas pour ce projet : en changeant la règle.

Le graphe des branches

Graphe ouvre toutes les branches dans un onglet — vos branches locales, les branches distantes récupérées et les étiquettes —, du plus récent au plus ancien, sur les cinq cents derniers commits, dessinées comme le fait git log --graph --all : une voie colorée par lignée, un point par commit, et le nom des branches et des étiquettes qui pointent dessus, HEAD en premier. Cliquez sur un commit pour l’afficher en entier à droite, comme dans l’historique.

Récupérer et pousser

Quand le dépôt a un dépôt distant, le panneau propose Récupérer et Pousser ; et quand la branche en suit une, son nom est accompagné de sa destination et de l’écart entre les deux : origin/main ↑2 ↓0 — deux commits qu’un envoi enverrait, aucun qu’un pull ramènerait —, ainsi que Rebaser.

  • Récupérer correspond à git fetch --all --prune.
  • Pousser correspond à git push. Une branche qui n’en suit encore aucune est poussée vers l’unique dépôt distant, ou vers origin, et configurée pour le suivre — git push -u. S’il y a plusieurs dépôts distants et qu’aucun ne s’appelle origin, l’éditeur vous invite à choisir en ligne de commande.
  • Rebaser correspond à git rebase : vos commits absents du dépôt distant sont rejoués par-dessus les siens — récupérez d’abord, pour qu’il soit à jour. Si un commit entre en conflit, le rebasage est aussitôt annulé et la barre d’état l’indique : votre branche et vos fichiers sont comme avant, et un rebasage avec des conflits à résoudre relève d’un terminal. Il ne démarre pas tant qu’un document contient des modifications non enregistrées, ni pendant une fusion ou une autre opération git ; les documents qu’il a réécrits sont relus.

Ces trois commandes utilisent le git installé : vos clés ssh, vos gestionnaires d’identifiants et vos proxys fonctionnent comme dans un terminal. L’éditeur n’attend jamais de mot de passe : un dépôt distant qui en demande un que personne n’a enregistré — ou une clé ssh protégée par une phrase de passe qu’aucun agent ne détient — échoue immédiatement, et la barre d’état reprend le message de git. Il en va de même pour tout autre échec. Pendant l’exécution, le bouton l’indique, et un second appui ne fait rien.

Blame

Fichier › Historique des lignes (blame) ouvre un onglet avec chaque ligne du fichier et, pour chaque groupe de lignes, le commit qui les a modifiées en dernier, son auteur et sa date — l’équivalent de git blame. Il décrit la version du fichier au dernier commit : les lignes tapées depuis n’ont pas encore de commit.

Une fusion arrêtée sur des conflits

Quand git merge s’arrête, le panneau indique que la fusion est en cours et marque les fichiers en conflit d’un U. Double-cliquez sur l’un d’eux pour l’ouvrir dans un onglet de fusion : chaque conflit avec notre version à gauche et la leur à droite — et l’ancêtre commun en dessous quand git en a écrit un —, et trois boutons, Garder notre version, Garder leur version et Garder les deux. Un choix réécrit aussitôt ce bloc dans le fichier, et tout onglet affichant ce fichier le montre. (C’est le fichier qui fait foi : corrigez un bloc à la main dans l’éditeur, et il disparaît simplement de l’onglet de fusion.) Quand il n’en reste plus, Marquer comme résolu fait ce que git add fait d’un fichier en conflit.

Commitez ensuite depuis le panneau. Un message vide reprend celui que git a préparé — Merge branch ‘feature’ — et le commit est la fusion : les deux branches en sont les parents, et la fusion est terminée.

Ce qui manque encore

Lancer une fusion, faire un pull, et un rebasage qui s’arrête pour vous laisser résoudre ses conflits.

show_git = true      # false retire le panneau
git_side = "left"    # ou "right"

Lire et partager

L’aperçu

  • Ctrl+Maj+V (Fichier › Affichage › Aperçu à la place du texte) : le document mis en forme, à la place de son texte. La même touche ramène le texte.
  • Ctrl+Maj+B (Fichier › Affichage › Aperçu à côté du texte) : les deux, côte à côte. L’aperçu suit le curseur de titre en titre ; faire défiler un côté amène l’autre au même titre, et un clic sur un titre de l’aperçu y mène le texte.

L’aperçu en direct se redessine à chaque frappe et suit le thème de l’éditeur, pas votre feuille de style ; les maths, les icônes des encadrés et les diagrammes s’y affichent tels qu’écrits. Pour eux, utilisez l’aperçu complet.

  • Réglages : markdown_mode ("edit", "preview", "split") — la vue dans laquelle s’ouvre un fichier markdown ; preview_follows_caret.

Voir Aperçus et exports : qui affiche quoi.

L’aperçu complet

L'aperçu complet : la feuille de style, le tableau, les formules dessinées
L'aperçu complet : la feuille de style, le tableau, les formules dessinées

L’éditeur propose deux aperçus, chacun pour un moment différent.

L’aperçu en direct — à côté du texte, ou à sa place — est dessiné par l’éditeur lui-même, avec son propre thème. Il suit chaque frappe : c’est l’aperçu avec lequel on écrit.

L’aperçu complet est une fenêtre à part qui affiche le document comme le ferait un navigateur : votre feuille de style, exactement telle que vous l’avez écrite, avec de vrais tableaux, une vraie typographie et de vrais diagrammes mermaid. C’est celui que l’on ouvre quand la question est à quoi cela ressemblera-t-il pour quelqu’un d’autre.

L’activer

Il est proposé par défaut, et c’est tout ce que fait le réglage : le moteur de rendu ne coûte rien tant qu’aucun aperçu n’est ouvert, donc heavy_preview décide seulement si la commande et son bouton existent. Avec false, ils disparaissent.

Dans votre fichier de réglages — Éditeur › Fichier de réglages, ou Ctrl+, :

heavy_preview = true   # la valeur par défaut ; false retire la commande

La compilation est l’autre moitié. Le moteur de rendu est un second programme, kve-preview, compilé avec l’éditeur par make build et installé à côté de lui par make install. Une version compilée sans lui le dit quand vous demandez un aperçu, au lieu d’échouer en silence.

Ces deux interrupteurs existent pour une seule raison — la mémoire qu’occupe un aperçu ouvert —, expliquée plus bas plutôt que passée sous silence.

L’ouvrir

Ctrl+Maj+P, ou Ouvrir dans l’aperçu complet dans la section Vue du panneau markdown. La même commande le referme, tout comme Échap dans la fenêtre ou le bouton de fermeture de la fenêtre.

Il suit votre frappe au même rythme que l’aperçu en direct, et garde votre position dans la page : un aperçu qui reviendrait en haut à chaque touche ne servirait à rien.

Il affiche le document au premier plan. Changez d’onglet, et l’aperçu change avec vous : les deux ne peuvent jamais montrer des documents différents.

S’y déplacer

La molette et le pavé tactile le font défiler, tout comme le clavier :

↑ ↓ Ligne par ligne
Page préc. Page suiv. Un écran, en gardant deux lignes du précédent
Espace / Maj+Espace La même chose, pour une main qui n’est pas sur les flèches
Origine Fin Le haut, et le bas
Échap Fermer la fenêtre

Échap ferme la fenêtre, et seulement Échap : avec un modificateur, la touche appartient aux raccourcis du moteur de rendu ou à votre bureau, si bien que Ctrl+Échap — qu’utilisent certains gestionnaires de fenêtres — laisse cette fenêtre en place.

Il n’y a pas de barre de défilement, et cela ne vient pas de nous : le moteur de rendu dessine le curseur de la barre de la page sans jamais le rendre visible. Le problème est signalé, le rapport est rédigé, et en attendant la fenêtre s’en passe — c’est à cela que servent les touches ci-dessus.

Ce qu’il affiche

  • Votre feuille de style, telle quelle. Celle que le document a retenue — une règle de dossier, une ligne css: dans le document, ou celle choisie dans la barre d’état. Elle est servie exactement comme vous l’avez écrite, sans jamais être retouchée pour suivre le thème de l’éditeur. Seule exception : la feuille de style fournie avec l’éditeur, qui contient une palette claire et une sombre et suit votre thème, puisqu’elle est à nous.

  • Les images à côté du document. ![](images/capture-1.png) est cherché à partir du dossier du document, comme partout ailleurs.

  • Les diagrammes. Un bloc délimité marqué mermaid est dessiné comme un diagramme :

    ```mermaid
    flowchart TD
      A[Éditeur] --> B[Aperçu]
    ```
    

    Le dessin est fait en Rust, dans l’éditeur, sans rien à installer — ni Node, ni navigateur, ni moteur JavaScript. Un diagramme qui ne s’analyse pas est affiché tel que vous l’avez tapé, avec le message d’erreur du moteur en dessous, pour que vous voyiez quelle flèche pose problème.

  • Les fichiers HTML aussi. Ouvrez un fichier .html et utilisez le même raccourci : il s’affiche comme la page qu’il est, au lieu d’être lu comme du markdown.

  • Les drapeaux en couleur. 🇫🇷 est formé de deux lettres que seule une police d’émojis en couleur réunit en drapeau. GNU FreeFont, installée sur de nombreux systèmes Linux, les dessine comme deux lettres encadrées, et serait trouvée en premier. L’aperçu fonctionne donc sans FreeFont — l’aperçu seulement : les autres programmes la voient toujours. Conséquence : une feuille de style qui demande FreeSans, FreeSerif ou FreeMono obtient ici la police suivante de sa liste.

  • Le ❤️ en couleur aussi. ❤️, c’est ❤ suivi d’un caractère invisible qui signifie sous forme d’émoji, s’il vous plaît. Une police qui possède son propre ❤ — souvent la police du texte de la page — le dessine en gris sans tenir compte de la demande. Tout caractère écrit ainsi passe donc d’abord par les polices d’émojis en couleur, ici et dans une page exportée. Un ❤ écrit sans cette demande reste tel que la police du texte le dessine.

Ce qu’il ne fait pas

Il n’a pas accès au réseau. Un document qui renvoie vers une image sur internet affiche son texte alternatif à la place. C’est voulu, et garanti par construction plutôt que promis : la partie du moteur qui ferait la requête n’est pas dans le programme. Un aperçu qui irait chercher en silence tout ce qu’un document désigne informerait quelqu’un d’autre de ce que vous lisez.

Il ne défile pas avec le texte. Pas encore — voir la feuille de route : c’est ce que cette fenêtre rend possible, pas ce qu’elle fait déjà.

Ce qu’il coûte, et quand

C’est la seule fonction de l’éditeur dont le coût en mémoire mérite d’être énoncé clairement, d’où ses deux interrupteurs.

L’éditeur, sans aperçu ouvert environ 117 Mo
La fenêtre de l’aperçu environ 117 Mo de plus
L’éditeur, du seul fait de le proposer environ 5 Mo

L’aperçu est un programme séparé, et c’est ce qui rend ces chiffres fiables : un éditeur qui n’en ouvre jamais n’en garde rien. Fermez l’aperçu et toute sa mémoire est rendue à la machine ; fermez l’éditeur et l’aperçu se ferme avec lui.

Mesures faites sur la machine la plus lente que l’éditeur est censé rencontrer : un ordinateur portable de 2017 avec une puce graphique intégrée, qui dessine en logiciel.

Choisir une feuille de style

Le nom à droite du pied de fenêtre est la feuille de style avec laquelle le document est dessiné dans l’aperçu complet et l’export. Cliquez dessus pour en choisir une autre, dans l’ordre où l’éditeur la cherche :

  1. Celle que vous choisissez dans cette liste, pour ce document, sur cette machine.
  2. Celle du document, dans son en-tête : css: ./maison.css.
  3. Une règle pour tout un dossier, dans .kaivalya/project.toml.
  4. Celle qui est fournie, celle de GitHub.

Vos propres feuilles de style vont dans ~/.config/kaivalya-editor/styles/. Voir Choisir une feuille de style et Ajouter une feuille de style.

Exporter en HTML

Fichier › Exporter en HTML… écrit le document dans un seul fichier .html, la page que montre l’aperçu complet. Il pose trois questions, la réponse raisonnable déjà choisie :

  • Les images dans la page (un seul fichier qui marche partout) ou à côté.
  • Les maths et les diagrammes dessinés ici, ou laissés au navigateur du lecteur, qui les dessine avec MathJax et mermaid.js — de meilleures maths, mais la page va alors sur le réseau à l’ouverture.
  • Un bouton de retour sur chaque note de bas de page, et la feuille de style.

Projet › Exporter le projet en HTML… exporte chaque fichier markdown du projet dans un dossier, aux mêmes chemins ; les liens entre pages continuent de marcher, et ce que git ignore n’est pas exporté. Pour un PDF, imprimez la page depuis un navigateur.

  • Réglages : export_mathjax_url, export_mermaid_url — d’où le navigateur les récupère.

Voir Exporter en HTML.

Comment votre markdown est lu, et le panneau markdown

Les sections du panneau markdown : Document, Texte, Outils, Tableau, Vue, Rétroliens
Les sections du panneau markdown : Document, Texte, Outils, Tableau, Vue, Rétroliens

Ctrl+Maj+M ouvre le panneau markdown : chaque commande markdown, en sections — Document (formater, orthographe, table des matières, coller une image, exporter), Texte (gras, italique, barré), Outils (caractères, formule, couleurs), Tableau, Vue (les aperçus) — chacune avec sa touche, puis Rétroliens, et la liste des feuilles de style en haut.

L’éditeur lit le markdown de GitHub et un peu plus : tableaux, listes de tâches, barré, notes de bas de page (écrites n’importe où), encadrés (> [!TIP], repliables), [[wikiliens]] et inclusions ![[note]], #mots-clés, propriétés de l’en-tête, et maths en $…$ et $$…$$ — chacune décrite ci-dessous.

Toutes les extensions sont activées, toujours. Un tableau à barres verticales est un tableau, ~~barré~~ est barré, > [!NOTE] est un encadré, $E = mc^2$ est une formule, et un {#mon-id} sur un titre est l’ancre vers laquelle vous pouvez faire un lien. Il n’y a rien à choisir et rien à activer.

C’est un changement d’avis. Il existait auparavant quatre variantes — CommonMark, celle de GitHub, celle de mkdocs, et tout à la fois —, choisies document par document, au motif qu’une variante est une affirmation sur la façon dont un autre outil lira ce fichier. L’argument était juste, mais le choix ne valait pas ce qu’il coûtait : quelqu’un qui a décidé de ne pas écrire de liste de définitions n’a pas besoin d’un éditeur qui les lui cache. Le réglage, l’indicateur de la barre d’état, le sélecteur, la clé flavour: et l’entrée de menu ont donc tous disparu : il reste une seule lecture d’un document.

Ce qui est reconnu

Vous écrivez Vous obtenez
| a | b | et une ligne |---| un tableau
~~barré~~ du texte barré
- [ ] une tâche une case à cocher
texte[^1] et [^1]: une note une note de bas de page, et une section à la fin
> [!NOTE] un encadré avec sa couleur et son icône
> [!NOTE]+ et > [!NOTE]- un encadré repliable
[[Une note]] et ![[une image.png]] un lien vers ce fichier, et cette image
#lecture une étiquette, signalée dans la page
## Titre {#mon-id} un titre vers lequel faire un lien sous le nom mon-id
Terme puis : définition une liste de définitions
$E = mc^2$ et $$…$$ une formule dessinée
H ~2~ O et x ^2^ un indice et un exposant

Les titres, les listes, les liens, les images, les blocs de code, la mise en valeur et les citations relèvent de CommonMark, la base de tout le reste.

Le plan, la table des matières et toutes les ancres sont lus de la même façon. Ils passent par le même analyseur avec les mêmes extensions : l’ancre d’un titre dans le plan est celle vers laquelle pointe une table des matières générée.

Les deux extensions désactivées, et pourquoi

Tout ce que propose pulldown-cmark, à deux exceptions près, qui sont des décisions et non des oublis :

  • Les notes de bas de page à l’ancienne ne sont pas un troisième type de note, mais une autre lecture de la même syntaxe, et les deux ne peuvent pas être actives en même temps. La version moderne est celle qu’affiche GitHub : c’est donc elle qui est activée.
  • La ponctuation typographique automatique réécrit vos guillemets et vos tirets — "comme ceci" devient “comme ceci” — au lieu de reconnaître une construction que vous avez tapée. Cet éditeur ne modifie pas en silence ce que vous avez écrit.

Une construction qui peut piéger du texte

Tout activer a un coût, et mieux vaut le dire que le découvrir. Une ligne qui commence par deux-points, sous une ligne courte, forme une liste de définitions :

Terme
: cette ligne fait des deux une liste de définitions

C’est la seule construction capable de s’emparer d’un texte qui ne la visait pas. Les autres ont été vérifiées et ne posent pas de problème : ~5 minutes, #12, C# et #1 priorité restent du texte ordinaire, car les délimiteurs de ces extensions ne peuvent pas se trouver à l’intérieur d’un mot.

C’est aussi toute la règle pour ^exposant^ et ~indice~. H ~2~ O et x ^2^ donnent un indice et un exposant ; H~2~O et x^2^ restent exactement les caractères que vous avez tapés.

Les encadrés

> [!NOTE]
> Une information utile, même en lecture rapide.

Il en existe cinq — NOTE, TIP, IMPORTANT, WARNING, CAUTION —, chacun affiché comme une citation avec un filet coloré et son propre mot au-dessus du texte, comme le fait GitHub.

Les deux feuilles de style fournies avec l’éditeur les affichent, tout comme n’importe quelle feuille de style écrite pour le balisage de GitHub : la page porte les mêmes classes markdown-alert que les pages de GitHub.

En replier un

Un + ou un - après le crochet rend l’encadré repliable — c’est l’écriture d’Obsidian :

> [!NOTE]+
> Ouvert, et repliable.

> [!TIP]- Un titre à lui
> Replié tant que vous ne l'ouvrez pas.

+ l’ouvre déplié, - l’ouvre replié, et ce qui suit sur la même ligne devient le titre de l’encadré, à la place du mot. Un encadré replié n’est pas caché : son contenu est dans la page et dans chaque export, à un clic.

Un titre est du markdown, puisque c’est votre texte et non un mot-clé : **gras**, *italique*, `code`, ~~barré~~, un lien et une image y fonctionnent. Un titre contenant ce qu’un titre d’une ligne ne peut pas contenir — une formule, une note de bas de page, un lien wiki, un titre — est affiché tel que vous l’avez tapé plutôt qu’à moitié interprété.

L’aperçu complet et une page exportée les replient. L’aperçu à côté de l’éditeur est dessiné par un moteur de rendu que cet éditeur n’a pas écrit, et affiche le marqueur tel qu’il est écrit — la même limite que rencontrent là toutes les constructions de cette section.

Les étiquettes

#lecture, #a-faire, #projet/kaivalya. Un # en début de ligne ou après une espace, suivi de lettres, de chiffres, de -, _ ou / — avec au moins un caractère qui n’est pas un chiffre, la condition qui fait de #12 un numéro de ticket. C# n’est pas non plus une étiquette, puisque le # est précédé d’une lettre. Un / crée une hiérarchie au lieu de séparer : #projet/kaivalya est une seule étiquette.

Une étiquette est signalée, pas liée. L’éditeur n’a pas d’index des étiquettes, donc nulle part où mener un lien ; la feuille de style de l’éditeur lui donne une couleur discrète et un fond arrondi, et les feuilles de GitHub la laissent en texte, puisqu’elles sont fournies telles que publiées. Pour trouver tous les documents qui contiennent une étiquette : Ctrl+Maj+F et l’étiquette elle-même.

Un # dans une portion de code, un bloc délimité, une URL ou l’{#ancre} d’un titre n’est pas une étiquette : ces éléments passent par l’analyseur au lieu d’être cherchés dans le texte.

Les propriétés, si vous voulez les afficher

---
title: Une note
tags: lecture, rust
css: charte.css
---

L’en-tête ne fait pas partie du document : c’est une instruction pour l’éditeur, et c’est pourquoi il n’a jamais été affiché. Si vous y gardez des notes sur le document plutôt que des réglages, un réglage l’affiche sous forme de tableau au-dessus de la page :

markdown_properties = true

Désactivé par défaut, et pour cause : activé, un document dont l’en-tête ne contient qu’une ligne css: se retrouve avec un tableau de deux lignes en haut de son aperçu. Seules les vues mises en forme sont concernées — l’aperçu complet et les deux exports —, jamais le texte.

Les notes de bas de page, où que vous les écriviez

Une affirmation[^pourquoi] qui mérite une note.

[^pourquoi]: Pour cette raison.

Elles sont rassemblées dans une section à la fin, même si leurs définitions sont éparpillées dans le document, et numérotées dans l’ordre de leur premier appel plutôt que selon leur nom — [^pourquoi] et [^plus-tard] deviennent 1 et 2 —, chacune avec une flèche qui ramène à l’endroit où elle est appelée. C’est ce que fait GitHub, et c’est pourquoi une note définie au milieu du document n’apparaît pas au milieu de la page.

Une définition qui n’est appelée nulle part est tout de même imprimée, en dernier et sans flèche : c’est votre texte, et la flèche n’aurait nulle part où mener. Un appel sans définition reste le texte que vous avez tapé.

Une différence avec GitHub, qui tient au moteur de rendu et non au document : les crochets que la feuille de style de GitHub dessine autour d’un appel — [1] — sont du contenu généré, que le moteur de l’aperçu ne dessine pas. Le numéro est là, pas les crochets. Une page exportée ouverte dans un navigateur les affiche.

Dans une page exportée, survoler un appel affiche le contenu de la note. Le petit numéro porte le texte de la note — mis sur une ligne et coupé à deux cents caractères —, pour lire une note sans quitter la phrase. Cela ne demande ni script ni feuille de style, et c’est présent dans chaque export. L’aperçu n’affiche rien au survol : son moteur ne dessine aucune infobulle, et c’est pourquoi les flèches de retour portent le nom de leur section en texte visible, plutôt que dans une infobulle.

Les mathématiques, dessinées plutôt que décrites

En ligne : $E = mc^2$, au milieu d'une phrase.

$$
\sum_{i=1}^n a_i = 0
$$

Dessinées en SVG, dans l’aperçu complet et dans une page exportée. $…$ reste dans sa phrase, posé sur la ligne de base ; $$…$$ forme un bloc à part, centré, avec de l’espace au-dessus et en dessous, et son propre défilement horizontal quand une matrice dépasse la largeur de la colonne.

Une formule impossible à dessiner est affichée sous forme du TeX tapé, jamais comme un vide : une formule en bloc montre son source dans un bloc de code, avec le message d’erreur du moteur en dessous, et une formule en ligne montre son source comme du code, car un message d’erreur au milieu d’une phrase serait pire que la phrase.

Le moteur est écrit entièrement en Rust et intégré au programme, avec ses propres polices mathématiques : rien à installer, pas de JavaScript, et rien n’est téléchargé pendant la lecture. Une page exportée contient les formules en SVG : elle s’ouvre partout, sans feuille de style, police web ni script.

Une formule a la taille du texte qui l’entoure. Elle est dessinée en em : elle suit donc votre feuille de style — un paragraphe, un titre, une cellule de tableau — au lieu d’avoir une taille choisie par l’éditeur. Un réglage l’ajuste :

maths_scale = 1.1

C’est un rapport, pas une taille. 1.0 correspond exactement à la taille du texte environnant ; 1.1 est la valeur par défaut, car une police mathématique à côté d’une police de texte de même taille paraît petite.

Ce que cela ne promet pas

Ce n’est pas la promesse que votre document s’affichera à l’octet près comme sur GitHub ou avec mkdocs build. Personne ne peut le promettre : ce sont des cibles mouvantes, et une bonne part de ce qu’ils font tient à leur moteur de rendu plutôt qu’à leur analyseur. Vous obtenez ici la lecture la plus généreuse — tout ce que votre document peut être —, la bonne quand la question est « qu’est-ce que j’ai écrit », et qui reconnaît une construction de plus que ce qu’affichera ailleurs un lecteur strict.

Deux limites à connaître :

  • L’aperçu en direct est dessiné par le moteur de rendu de quelqu’un d’autre. C’est celui de gpui-component, dont nous ne choisissons pas les extensions : il est proche, sans être exact — un bloc de code, un tableau et un encadré méritent d’être vérifiés dans l’aperçu complet, dont le moteur appartient à cet éditeur et que Exporter en HTML écrit.
  • Seul ce que vous tapez est lu. L’éditeur ne télécharge, ne développe et n’exécute rien dans votre document : un diagramme mermaid est dessiné à partir de son bloc, une formule à partir de son TeX, et rien ne part nulle part.

L’apparence d’un document — la feuille de style avec laquelle il est affiché — est une autre question, avec sa propre réponse : Choisir une feuille de style.

Autres vues et outils

La vue journal

irrigation.log, filtré sur les lignes qui parlent de la pompe
irrigation.log, filtré sur les lignes qui parlent de la pompe

Un fichier se terminant par .log — ou un journal archivé par rotation, comme app.log.1 — s’ouvre dans la vue journal plutôt qu’en texte. N’importe quel autre fichier peut y être affiché avec Fichier › Afficher comme journal.

Ce que vous voyez

Chaque ligne avec son numéro, son horodatage en grisé, et le reste dans la couleur de son niveau : les erreurs en rouge, les avertissements en orange, les informations dans la couleur du texte, le débogage et la trace en grisé. Le niveau est repéré comme un mot proche du début de la ligne, quelle que soit la façon dont le journal l’écrit — ERROR, [error], level=error, "level":"error", FATAL, WARNING. Une ligne sans niveau propre, comme une trace de pile, est rattachée à la ligne qui la précède.

Filtrer

  • Tapez dans Filtrer les lignes… pour ne garder que les lignes qui contiennent ce texte, sans tenir compte des majuscules.
  • Cliquez sur un niveau — ERROR 12, WARN 40… — pour masquer ou afficher ses lignes. Chacun indique combien de lignes du fichier ont ce niveau. Une trace de pile reste avec son erreur.

Le nombre de lignes affichées, sur le total du fichier, figure à droite.

Chercher par date

La ligne sous les niveaux contient trois champs.

  • Du et Au gardent les lignes comprises entre deux moments, en plus du filtre de texte et des niveaux. Écrivez un jour, 2026-10-07, une heure ce jour-là, 2026-10-07 13:00, ou — à côté d’une borne qui a un jour — une heure seule, 13:05. Ce que vous écrivez est pris en entier : 2026-10-07 dans Au désigne la fin de ce jour, 13:05 la fin de cette minute. Chaque borne peut rester vide. Un champ qui ne contient pas une heure est encadré de rouge et ne filtre rien.
  • Aller à l’heure… — écrivez une heure et appuyez sur Entrée : la vue va à la première ligne à cette heure ou après, et la sélectionne. Rien n’est masqué : ce qui précède est juste au-dessus. Une heure postérieure à la dernière ligne est signalée, et la vue va à la fin. Une heure seule est comprise comme le dernier jour du journal.

Ce qui compte comme l’heure d’une ligne : l’horodatage par lequel elle commence — ISO (2026-10-07T13:00:05.123Z, ou avec une espace), entre crochets ou non, ou syslog (Oct 7 13:00:05, dans l’année où le fichier a été écrit) —, ou un horodatage un peu plus loin, après une priorité syslog (<6>Oct 7 …) ou sous forme de clé (time="2026-10-07T…"). Une ligne sans horodatage, comme une trace de pile, prend l’heure de la ligne précédente. Les heures sont comparées telles qu’écrites : un journal en UTC se cherche en UTC.

Le saut trouve sa ligne en coupant le fichier en deux plutôt qu’en le lisant, ce qui le rend instantané quelle que soit la taille — et suppose, comme c’est le cas des journaux, que le fichier est écrit dans l’ordre chronologique.

Suivre un journal qui grossit

Suivre garde la dernière ligne à l’écran. Que cette option soit active ou non, la vue consulte le fichier chaque seconde : les nouvelles lignes sont lues et filtrées dès leur arrivée, et un fichier devenu plus court — archivé ou vidé — est relu depuis le début.

Les gros fichiers

La vue journal ne charge jamais le fichier dans l’éditeur. Elle repère le début de chaque ligne et ne lit que celles qui sont à l’écran : un journal de plusieurs centaines de mégaoctets s’ouvre en un instant et prend peu de mémoire. Le filtrage relit tout le fichier à chaque changement de filtre, sans bloquer l’affichage — environ un sixième de seconde pour 50 Mo.

Revenir au texte

Ouvrir en texte ouvre le fichier dans un onglet ordinaire, à la ligne sur laquelle vous avez cliqué ; un double-clic sur une ligne fait de même. Le fichier entier est alors chargé dans l’éditeur : pour un très gros journal, restez dans la vue journal.

Tableaux blancs

Un fichier .canvas sur le tableau : les trois planches et la note vers laquelle elles mènent
Un fichier .canvas sur le tableau : les trois planches et la note vers laquelle elles mènent

Un tableau blanc est un fichier .canvas : des cartes de texte, des notes, des liens, des images et des groupes posés sur un plan, reliés par des flèches. C’est le format d’Obsidian (JSON Canvas) : un tableau fait ici s’ouvre là-bas, et inversement.

En créer un, en ouvrir un

Fichier › Nouveau › Nouveau tableau blanc (.canvas) crée Tableau blanc.canvas à la racine du projet — Tableau blanc 2.canvas s’il est pris — et l’ouvre. Tout fichier .canvas s’ouvre sur le tableau, depuis l’explorateur, le sélecteur de fichiers ou la ligne de commande. Si le fichier n’est pas du JSON Canvas, il s’ouvre en texte, avec la raison dans la barre d’état, pour être réparé ; Fichier › Afficher comme tableau blanc le remet sur le tableau une fois réparé.

Le tableau s’ouvre ajusté pour tout montrer. Sa vue n’est pas enregistrée : le format n’a pas de place pour elle.

Se déplacer

molette déplacer le tableau de haut en bas ; Maj + molette, de côté
Ctrl + molette zoomer, autour du pointeur
bouton du milieu, ou Espace maintenue, et glisser déplacer le tableau
Ajuster, Ctrl+0 tout montrer

Le niveau de zoom est affiché à droite de la barre d’outils.

Les cartes

  • Double-cliquez sur un endroit vide : une carte apparaît à cet endroit, prête à recevoir du texte. Ce texte est du markdown, comme chez Obsidian, et il est affiché mis en forme — titres, mise en valeur, listes, cases à cocher, liens, code et tableaux — à la taille du zoom. Échap, ou un clic ailleurs, valide la carte — une carte laissée vide n’est pas conservée. Quand le zoom est si faible que le texte ne ferait que quelques pixels, seul le cadre de la carte est affiché.
  • Double-cliquez sur une carte pour y écrire de nouveau, sur le nom d’un groupe pour le renommer, sur une flèche pour lui donner une étiquette.
  • Carte dans la barre d’outils en crée une au milieu de la vue.
  • Glissez une carte pour la déplacer. Maj + clic ajoute à la sélection ; glisser sur un endroit vide sélectionne tout ce qui est entièrement dans le rectangle.
  • Glissez le carré au coin d’une carte sélectionnée pour la redimensionner.
  • Les couleurs de la barre d’outils s’appliquent à la sélection — cartes et flèches ; le cercle vide retire la couleur. Les six sont les couleurs prédéfinies d’Obsidian. + ouvre la fenêtre des couleurs pour n’importe quelle autre couleur : choisissez-en une, et Insérer l’applique à la sélection, enregistrée sous la forme #rrvvbb, qu’Obsidian affiche aussi. La couleur d’une carte donne sa bordure et un fond léger ; son texte garde la couleur de texte du tableau.

Les flèches

Une carte sous le pointeur, ou sélectionnée seule, montre un petit cercle sur chaque côté. Glissez de l’un d’eux vers une autre carte : une flèche, de ce côté vers le côté qui lui fait face — ou vers le côté dont vous lâchez le cercle. Lâchez ailleurs et rien n’est créé.

Les groupes

Sélectionnez des cartes et appuyez sur Grouper (Ctrl+G) : un cadre autour d’elles, derrière elles, dont le nom se tape aussitôt, dans un champ affiché au-dessus des cartes. Glissez un groupe par son nom et ce qu’il contient le suit. Supprimer un groupe laisse ce qu’il contenait.

Notes, liens et images

  • Une note est une carte qui montre son début : glissez un fichier depuis l’explorateur sur le tableau, déposez-en un depuis le gestionnaire de fichiers, ou choisissez-le avec Note ou image…. Un double-clic sur la carte ouvre la note dans l’éditeur.
  • Une image, de la même façon. Une image déjà dans le projet est utilisée là où elle est ; une image venue d’ailleurs est copiée dans le dossier des images collées (paste_image_folder, images par défaut).
  • Une carte de lien ouvre son adresse dans le navigateur sur un double-clic. Collez une adresse sur le tableau — https://…, mailto:…, seule — et elle en devient une ; ou appuyez sur Lien…, tapez l’adresse dans le champ qui s’ouvre dans la barre d’outils, puis Entrée (example.org devient https://example.org). La carte affiche l’adresse : l’éditeur ne télécharge jamais une page pour en montrer un aperçu.

Le tableau désigne un fichier par son chemin depuis la racine du projet, comme Obsidian depuis celle du coffre — ouvrez donc le coffre comme projet. Une note hors du projet est refusée, et la barre d’état dit pourquoi.

Un plan avec des repères, c’est tout cela réuni : votre plan en image, et de petites cartes de notes posées sur les lieux ; chacune ouvre sa note.

Les touches

Suppr, Retour arrière supprimer la sélection ; une flèche vers une carte supprimée part avec elle
Ctrl+Z, Ctrl+Maj+Z ou Ctrl+Y annuler, rétablir — aussi dans la barre d’outils
Ctrl+C, Ctrl+X, Ctrl+V copier, couper, coller — ce qui est copié est du JSON Canvas, qui se colle aussi dans Obsidian ; un texte venu d’ailleurs se colle en carte
Ctrl+A tout sélectionner
Ctrl+G grouper la sélection
flèches déplacer la sélection de 10 unités ; avec Maj, de 1
Entrée écrire dans la carte ou la flèche sélectionnée
Échap arrêter d’écrire ; sinon, ne plus rien sélectionner

L’enregistrement, et le fichier

Le tableau est écrit dans son fichier après chaque changement, comme Obsidian l’écrit : une ligne par carte et par flèche, si bien qu’une carte modifiée est une ligne modifiée dans git. Ce que l’éditeur ne comprend pas dans un fichier écrit par Obsidian — un champ, un type de nœud — est réécrit tel quel.

Si le fichier ne peut pas être écrit — disque plein, dossier en lecture seule —, le changement reste sur le tableau, l’onglet est marqué non enregistré et la barre d’état dit pourquoi. Fichier › Enregistrer réessaie ; fermer l’onglet demande d’abord confirmation.

Ouvrir en JSON dans la barre d’outils ouvre le fichier en texte à côté du tableau. Enregistrez-le depuis cet onglet et le tableau le relit ; il fait de même après une modification faite par un autre programme, Obsidian compris.

Exporter

Exporter en SVG… écrit le tableau en une seule image, dans les couleurs où il est dessiné : n’importe quel navigateur, visionneuse d’images ou document l’ouvre. Les images du tableau sont dans le fichier, qui peut donc être envoyé seul.

Réglages

whiteboard_background la couleur derrière chaque tableau : "", par défaut, pour celle du thème, ou "#rrvvbb". Les cartes en prennent leur fond
whiteboard_text la couleur du texte du tableau — cartes, étiquettes, image exportée : "" pour celle du thème, ou "#rrvvbb". À changer avec le fond quand le texte du thème ne s’y lirait pas
whiteboard_grid une grille de points derrière les cartes, true par défaut

Le fichier d’Obsidian ne garde pas de fond : ces réglages sont ceux de l’éditeur, pour tous les tableaux ; Obsidian dessine le sien.

Les panneaux et le rail

L’explorateur, les fichiers ouverts, la recherche et le plan — ainsi que les panneaux markdown, caractères et couleurs — ont chacun un réglage pour leur côté et pour savoir s’ils sont proposés :

explorer_side = "left"    # ou "right"
search_side   = "left"    # ou "right"
outline_side  = "right"   # ou "left"
show_explorer = true
show_search   = true
show_outline  = true

Un réglage par panneau plutôt qu’un mode de disposition global : toutes les dispositions sont possibles, y compris les trois du même côté.

Un bord affiche un seul panneau, et chaque panneau de ce bord a une icône dans un rail étroit à côté. L’icône du panneau ouvert est enfoncée ; les autres sont relâchées. Cliquez sur une icône relâchée : son panneau s’ouvre, son icône s’enfonce et celle du panneau précédent se relâche. Cliquez sur l’icône enfoncée : le bord se replie jusqu’au rail et l’icône se relâche. Une barre latérale n’est jamais partagée, ni divisée.

Survolez une icône relâchée, et son panneau s’ouvre par-dessus votre texte, sans rien déplacer — la fenêtre reste exactement comme elle était, et le panneau disparaît quand le pointeur s’en va. Un glissement commencé dans le panneau ne compte pas comme un départ du pointeur : faites glisser un curseur du panneau des couleurs au-dessus du texte, et le panneau reste jusqu’à ce que vous relâchiez. Le survol sert à consulter, le clic à travailler. L’icône enfoncée ne fait pas cela, puisque son panneau est déjà là. Si des panneaux qui s’ouvrent au passage du pointeur vous gênent, peek_on_hover = false limite le rail aux clics.

Les icônes suivent l’ordre de rail_order, une seule liste pour les deux bords, et le premier panneau d’un bord est celui sur lequel il s’ouvre :

rail_order = ["explorer", "files", "search", "todo", "git", "outline", "markdown", "characters", "colour"]

Un panneau absent de la liste vient après ceux que vous nommez. rail_icon_size règle la taille des icônes, en pixels de 12 à 40 — 20 par défaut —, et le rail prend la largeur dont elles ont besoin.

Faites glisser la séparation à côté d’un panneau pour changer sa largeur. Le bouton dans l’en-tête d’un panneau replie lui aussi ce bord jusqu’au rail. Replié n’est pas fermé — un panneau fermé par le menu le reste jusqu’à ce que vous le redemandiez.

  • show_<panneau> propose un panneau ou non, <panneau>_side le met à gauche ou à droite — pour l’explorateur, les fichiers ouverts, la recherche, TODO, git, le plan, markdown, les caractères et les couleurs.
  • rail_order est l’ordre des icônes, une seule liste pour les deux bords ; rail_icon_size leur taille ; peek_on_hover = false fait que le rail ne répond qu’aux clics.
  • Les outils de couleur et de caractères s’ouvrent en fenêtres par défaut (colour_as, characters_as = "window" ou "pane").

Langages, coloration, retour à la ligne

  • Alt+Z (Fichier › Affichage › Retour à la ligne automatique) replie les lignes au bord de la fenêtre. Réglage : soft_wrap.
  • Fichier › Affichage › Afficher les caractères invisibles montre les espaces et les tabulations. Réglage : show_invisibles.
  • Le langage — qui décide des couleurs, du plan et du formateur — vient du nom du fichier. Cliquez dessus dans le pied de fenêtre, ou Fichier › Langage…, pour en choisir un autre pour ce fichier tant qu’il est ouvert. Un nouveau fichier est du markdown tant qu’il n’est pas enregistré sous un autre nom.

Les fichiers colorés

Dix-huit langages sont pris en charge :

Extension Langage
.md, .markdown markdown
.rs rust
.py, .pyi python
.sh, .bash, .zsh, ainsi que .bashrc, .bash_profile, .profile, .zshrc bash
.js, .mjs, .cjs, .jsx javascript
.ts, .mts, .cts typescript
.tsx tsx
.html, .htm html
.css, .scss css
.json, .jsonc json
.yaml, .yml yaml
.toml toml
.go go
.java java
.php php
.xml, .xsd, .xsl, .xslt, .svg xml
.vue vue — et ses trois blocs, chacun dans son langage
.properties lu comme du toml — voir plus bas
tout le reste texte — sans coloration
aucun fichier — le document sans titre markdown

Un fichier dont le nom entier indique le type n’a pas d’extension, mais il est quand même reconnu : .bashrc est un script shell.

Un fichier .vue contient trois langages à la fois. La grammaire colore la structure du composant — <template>, les balises et directives qu’il contient, v-if, :title, @click — et confie chaque bloc au langage qu’il déclare : TypeScript ou JavaScript dans <script>, CSS dans <style>. C’est le même mécanisme que pour les <script> et <style> d’un fichier HTML, et il fonctionne pour la même raison.

Un fichier properties est lu comme du TOML, qui a la forme qui compte — clé = valeur ligne par ligne, des commentaires # — : clés, séparateurs, commentaires, nombres et chaînes entre guillemets sont tous colorés. Seule une valeur sans guillemets ne l’est pas, puisque TOML exige des guillemets autour d’une chaîne. C’est toute la différence, et elle ne demande aucune grammaire supplémentaire.

Le code d’un bloc délimité dans un fichier markdown est coloré dans le langage du bloc quand sa grammaire est présente : un bloc ```rust est coloré comme du Rust.

Ce qui est coloré dans le source markdown

Le texte que vous écrivez, et pas seulement le code qu’il contient. Une grammaire renvoie ce qu’elle trouve et un thème colore ce qu’il connaît ; là où les deux listes ne concordent pas, le texte reste simplement brut — c’est pourquoi une citation ressemblait autrefois exactement au paragraphe suivant, à son > coloré près.

Titres Le texte, et les # dans leur propre couleur
Citation Toute la citation en italique, sans couleur propre, pour que la mise en valeur et les liens qu’elle contient gardent la leur
Cases à cocher [x] et [ ] sont affichés comme des valeurs, ce qu’ils sont
Tableaux Les séparateurs `
Texte barré ~~comme ceci~~ est atténué, car un surligneur ne peut changer ici que la couleur
Échappements \*, &amp; et &#123; — les trois façons de dire « ce caractère n’est pas une balise »
Liens Le texte d’une couleur, l’adresse d’une autre, les étiquettes de référence comme le texte d’un lien
Code En ligne, une portion de code ; un bloc délimité, dans son propre langage

Une citation est en italique plutôt que colorée, et c’est voulu. Quand deux styles veulent colorer le même texte, la boîte à outils graphique les départage dans un ordre que rien ici ne maîtrise : une citation colorée l’emporterait parfois sur la mise en valeur qu’elle contient, et parfois non. L’italique échappe à ce conflit : il se combine avec toutes les couleurs au lieu de rivaliser avec l’une d’elles.

Quand le langage est décidé

D’après l’extension du fichier, chaque fois que le nom peut changer :

  • quand vous lancez l’éditeur sur un fichier depuis la ligne de commande ;
  • avec Fichier › Ouvrir un fichier… ;
  • avec Fichier › Enregistrer sous…, si le nouveau nom a une autre extension.

Un nouveau fichier est du markdown

Un document sans titre — Ctrl+N, ou l’éditeur lancé sans fichier — est coloré comme du markdown, et le panneau markdown, l’aperçu et les commandes markdown y fonctionnent dès la première touche : c’est un éditeur markdown, un fichier qui n’a pas encore de nom en est donc très probablement un. Enregistrez-le sous une autre extension, ou ouvrez-y un fichier, et il prend ce langage.

Quand le nom induit en erreur

Le langage est indiqué à droite de la barre d’état, et un clic dessus permet d’en changer. Même chose avec Fichier › Langage…. La liste contient tous les langages que l’éditeur sait colorer, et D’après le nom du fichier, en haut, rétablit le choix automatique. Ce choix vaut pour ce fichier tant qu’il est ouvert — c’est une correction, pas une règle pour un type de fichier — et un Enregistrer sous l’efface, puisqu’un nouveau nom appelle une nouvelle réponse. Tout ce qui dépend de la nature du fichier suit ce choix : les couleurs, le plan, le panneau markdown et Formater ce fichier. Quand un choix manuel est actif, la barre d’état l’affiche dans une couleur plus vive.

L’éditeur ne regarde jamais le contenu d’un fichier pour deviner son langage : c’est le nom qui décide, et c’est à vous de corriger.

Ce qui manque encore

Un <style> ou un <script> dans un fichier HTML n’est pas coloré comme du CSS ou du JavaScript ; seul le HTML qui l’entoure l’est. Un bloc de code dans un fichier markdown, lui, est coloré dans son langage : il s’agit donc d’une lacune propre à un langage, pas d’une règle générale.

Thèmes

L’éditeur fournit sept thèmes, chacun dans son fichier :

Kaivalya Light Papier blanc cassé, encre chaude. C’est ce que signifie theme = "light".
Kaivalya Dark Un gris foncé chaud, des titres ambrés. C’est ce que signifie theme = "dark".
Kaivalya Night Un gris plus profond et plus froid, des titres bleus et du code vert. À choisir par son nom.
Kaivalya Kiln La palette du site web : blanc chaud, gris chauds et son rouge vif. À choisir par son nom.
Kaivalya Ember Les mêmes rouges sur un fond sombre et chaud, avec des chaînes de caractères olive. À choisir par son nom.
Kaivalya Red La fenêtre elle-même en rouge : interface rouge, bordures rouges, boutons orange. À choisir par son nom.
Kaivalya Blue La même idée, avec le turquoise et le bleu de Kaivalya Trainer. À choisir par son nom.

Les trois premiers sont volontairement discrets. Kiln et Ember forment la paire colorée, construite à partir des rouges du site web du projet — #cc3311 sur un papier chaud, #d2401a sur un anthracite teinté de rouge — et ce sont, avec Red et Blue, les seuls à définir une couleur d’accent : une ligne sélectionnée dans un menu y prend une teinte chaude plutôt que grise.

Red et Blue mettent la couleur dans la fenêtre plutôt que dans le texte : c’est ce qui les distingue de la paire précédente. La barre d’état, la barre de menus et les panneaux sont rouge foncé ou bleu marine, les bordures et la barre de défilement prennent la couleur d’accent elle-même, un bouton cliquable est orange ou bleu, et le code utilise une palette complète plutôt qu’une palette chaude. Blue emprunte ses deux couleurs d’accent à Kaivalya Trainer — #12a892 et #1e7fc0 — avec les gris verdâtres qui vont avec : c’est une autre famille, pas la même palette dont on aurait décalé la teinte.

Ils respectent les mêmes seuils de contraste que les thèmes discrets, car ces seuils portent sur la luminosité, et la teinte reste libre. C’est aussi ce qui explique leur saturation : la luminosité étant imposée, le seul moyen de faire paraître une fenêtre rouge est de consacrer toute la couleur à la teinte.

Red doit faire une chose que les autres n’ont pas à faire : sa couleur d’erreur est ambre, pas rouge. Dans une fenêtre aussi rouge, une erreur en rouge ne se distinguerait pas du reste. Blue n’a pas ce problème et garde une erreur rouge.

Kaivalya Blue est le thème d’ouverture de l’éditeur. C’est un choix, pas un point de départ neutre : cet éditeur forme une paire avec Kaivalya Trainer, et ce bleu est le sien. Il suffit d’une ligne, "system", pour suivre votre bureau, en clair ou en sombre comme le reste de votre écran :

theme = "Kaivalya Blue"    # la fenêtre dans le bleu de Trainer. Par défaut.
# theme = "system"         # suivre le bureau, clair ou sombre
# theme = "light"
# theme = "dark"
# theme = "Kaivalya Night" # ou n'importe quel thème, par son nom
# theme = "Kaivalya Ember" # le sombre coloré
# theme = "Kaivalya Kiln"  # le clair coloré
# theme = "Kaivalya Red"   # la fenêtre en rouge

Les thèmes propres à un projet

Un projet peut apporter ses propres thèmes dans .kaivalya/themes/, sous forme des mêmes fichiers JSON. Ils s’ajoutent aux vôtres tant que le projet est ouvert, un thème portant le même nom que l’un des vôtres l’emporte, et theme = "…" — dans vos réglages ou dans les réglages du projet — peut le désigner.

Où ils se trouvent

Dans ~/.config/kaivalya-editor/themes/, à côté de votre fichier de réglages, un fichier par thème :

kaivalya-light.json   kaivalya-kiln.json    kaivalya-red.json
kaivalya-dark.json    kaivalya-ember.json   kaivalya-blue.json
kaivalya-night.json   kaivalya-theme.schema.json

Ces fichiers appartiennent à l’éditeur et sont réécrits à chaque démarrage — c’est ainsi que les améliorations des thèmes fournis vous parviennent. Ce n’est donc pas en les modifiant que vous changerez vos couleurs : vos modifications disparaîtraient au démarrage suivant.

Un thème à vous est un autre fichier, déposé dans le même dossier, auquel rien ne touche. Toute la règle tient en une phrase : kaivalya-*.json est à nous, tout le reste du dossier est à vous.

Le dossier est surveillé : enregistrer l’un de ces fichiers change les couleurs sans redémarrer.

Le rôle de chaque valeur

JSON n’a pas de commentaires. Ce n’est pas qu’ils soient « déconseillés » : la syntaxe n’en prévoit pas, et l’analyseur refuse //. Un fichier de thème ne peut donc pas s’expliquer lui-même comme le fait votre settings.toml, et une centaine de couleurs aux noms comme popover.background vous disent comment une chose s’appelle, pas ce qu’elle colore.

C’est kaivalya-theme.schema.json, dans le même dossier, qui contient ces explications. Il s’agit d’un schéma JSON, et chaque clé y est décrite par ce qui change à l’écran quand vous la modifiez :

popover.background — Tout ce qui flotte au-dessus de la page : les menus, la barre de recherche ouverte par Ctrl+F, les infobulles, les notifications, le sélecteur de feuille de style. À définir même dans un thème sobre, car la valeur de repli est un piège : sans elle, un menu a la même couleur que la page en dessous, et seule une bordure d’un pixel indique où il commence.

La ligne $schema de chaque fichier de thème pointe vers lui : un éditeur qui lit cette ligne vous montre la description pendant la saisie — complétion des noms de clés, explication au survol. Celui-ci compris : c’est un fichier .json comme un autre.

Écrire le vôtre

Copiez n’importe quel kaivalya-*.json sous un autre nom dans le même dossier, modifiez-le, et indiquez le nom de votre thème dans vos réglages. Copiez plutôt que de modifier sur place, pour la raison donnée plus haut.

Le format est celui de la boîte à outils graphique, pas un standard. Deux choses à savoir si vous reprenez des couleurs d’ailleurs :

  • Le bloc highlight suit le format de Zed. Le code source de la boîte à outils indique que cette section assure la « compatibilité avec la section style des thèmes Zed » : les couleurs syntaxiques d’un thème Zed se transposent presque mécaniquement.
  • Ce n’est pas le cas d’un thème VS Code. Ce n’est pas qu’une question de structure de fichier : VS Code colore des portées TextMate (entity.name.function.rust), alors que celui-ci colore des noms de captures tree-sitter (function, punctuation.list_marker). Les deux vocabulaires ne se recoupent pas : transposer un thème oblige à décider ce qui correspond à quoi.

Un fichier de thème contient un ensemble de thèmes :

{
  "$schema": "./kaivalya-theme.schema.json",
  "name": "Mes thèmes",
  "themes": [
    { "name": "Mon clair", "mode": "light", "highlight": { "syntax": { } } }
  ]
}

Gardez la ligne $schema : c’est grâce à elle que votre éditeur vous explique les clés pendant que vous les écrivez.

Deux choses à savoir :

  • Vous n’écrivez que ce que vous voulez changer. Ce qu’un thème omet prend la couleur par défaut de la boîte à outils pour ce mode ; c’est d’ailleurs ainsi que fonctionnent les thèmes fournis : ils définissent le bloc syntax et héritent du reste de l’interface. Six entrées au lieu de quarante.
  • Un fichier illisible est ignoré, sans conséquence grave. L’éditeur le signale dans son journal et continue avec les thèmes valides : un thème à moitié écrit dans le dossier ne peut pas empêcher l’éditeur de s’ouvrir.
Les surfaces flottantes

À côté de syntax, le bloc colors d’un thème définit les couleurs de l’interface elle-même, et l’une d’elles mérite d’être signalée, car sa valeur de repli est un piège. popover.background est la couleur de tout ce qui flotte au-dessus de la page — la barre de recherche de Ctrl+F, les menus, les infobulles et les notifications. Un thème qui l’omet reprend le fond de la page : seule une bordure d’un pixel indique alors où commence un menu, et la barre de recherche n’a rien d’autre.

Les thèmes fournis la définissent : un cran à côté du papier plutôt qu’une autre couleur — plus chaud et plus foncé dans Kaivalya Light, plus clair dans les deux thèmes sombres.

"colors": { "popover.background": "#efeade" }
La barre d’onglets

Les onglets présentent le même piège, et les thèmes fournis y sont tombés : tab.background, tab.active.background et tab_bar.background reprennent tous par défaut le fond de la page. Un thème qui n’en définit aucun dessine la barre, les onglets inactifs, l’onglet actif et le document d’une seule couleur — autrement dit, l’onglet actif n’est plus du tout signalé.

Les thèmes fournis adoptent la disposition sur laquelle tous les éditeurs se sont accordés : l’onglet actif a la couleur de la page, et la barre s’en distingue d’un cran. L’onglet et le document en dessous forment une seule surface, sans rien à comparer ; la barre et les onglets inactifs sont un cran à côté — plus foncés dans Kaivalya Light, plus clairs dans les deux thèmes sombres, faute de marge sous un papier aussi sombre que celui de Kaivalya Night. Les libellés suivent : discrets sur la barre, à l’encre de la page sur l’onglet ouvert.

"colors": {
  "tab_bar.background": "#f2eee4",
  "tab.background": "#f2eee4",
  "tab.active.background": "#fdfdfb",
  "tab.foreground": "#5f5c55",
  "tab.active.foreground": "#33333a"
}

La barre d’onglets n’apparaît que lorsque plusieurs documents sont ouverts.

Ce que contrôle syntax

Les noms du bloc syntax sont ceux que produisent les grammaires ; voici ceux qui composent un fichier markdown :

title Le texte d’un titre
punctuation.special Le # d’un titre
punctuation.list_marker Le * ou le - d’une liste
punctuation.delimiter Le > d’une citation, le | d’un tableau, les marques autour de la mise en valeur
emphasis, emphasis.strong L’italique et le gras
link_text, link_uri Le texte d’un lien et son adresse
text.code.span Du code entre accents graves au fil d’une phrase
text.literal Un bloc de code délimité

Chacun accepte une color, et éventuellement font_weight et font_style :

"punctuation.list_marker": { "color": "#9A4A1E" },
"title": { "color": "#0433FF", "font_weight": 600 }

Un nom omis n’est pas coloré : il est dessiné dans la couleur du texte ordinaire, ce qui ressemble à un langage sans coloration plutôt qu’à un thème auquel il manque une entrée. C’était le cas des noms de ponctuation dans les thèmes de la boîte à outils elle-même, et c’est pour corriger cela que cet éditeur fournit ses propres thèmes.

Ce qu’un thème ne décide pas

L’apparence de l’aperçu markdown relève d’une feuille de style, pas d’un thème — voir Choisir une feuille de style. Les feuilles de style se trouvent dans styles/, à côté de ce dossier, et suivent la même règle : l’éditeur écrit celles qu’il fournit et ne touche à rien d’autre. Par défaut, c’est celle de GitHub, qui suit votre choix clair ou sombre ; celle que vous écrivez est utilisée exactement telle quelle.

Tailles et polices

Trois tailles, pour trois parties de la fenêtre — et celle des panneaux, pane_font_size, est un troisième réglage plutôt qu’un deuxième élargi :

font_size = 17.0            # le texte que vous écrivez
interface_font_size = 16.0  # les menus et les onglets
pane_font_size = 16.0       # l'explorateur, le plan, les résultats de recherche

La taille idéale d’une liste de noms de fichiers n’est pas celle de votre texte, ni celle des menus — et tant qu’on ne pouvait pas le régler, les panneaux faisaient 12,8 pixels, la plus petite chose de la fenêtre et la seule qu’on ne pouvait pas changer. Ces trois nombres sont les valeurs par défaut ; si vous les changez, gardez au moins l’ordre : un panneau plus discret que votre texte, car une arborescence de fichiers aussi présente que le texte, c’est beaucoup de fenêtre donnée à des noms de fichiers.

La grille de tableau n’est pas un panneau : ses cellules suivent font_size et ses boutons interface_font_size.

La police de chacun

Les trois mêmes questions, avec des noms au lieu de nombres :

font_family = "JetBrains Mono"   # le texte que vous écrivez
interface_font_family = "Inter"  # les menus et les onglets
pane_font_family = "Inter"       # l'explorateur, le plan, les résultats de recherche

Sans interface_font_family, les menus sont en IBM Plex Sans si elle est installée, sinon dans la première police de la liste du framework — Ubuntu, Noto Sans, DejaVu Sans… — qui a son propre gras (F242 : une police variable est dessinée à une seule graisse, son gras ne se verrait jamais). Sans pane_font_family, les panneaux suivent interface_font_family, car un panneau fait partie de l’interface. La police du texte a une valeur par défaut : font_family = "JetBrainsMonoNL Nerd Font Mono", pour la raison expliquée ci-dessous ; NL désigne la variante sans ligatures, qui laisse <!-- et --> tels que vous les avez tapés. font_family = "" revient à la police à chasse fixe du bureau.

Un émoji n’apparaît en couleur dans votre texte que si la police du texte n’en a pas sa propre version. ❤, ☺ et ✔ existent dans beaucoup de polices comme simples symboles, et l’éditeur utilise le glyphe de la police du texte avant de recourir à la police d’émojis en couleur — DejaVu Sans Mono, la police habituelle par défaut, a un ❤ gris. Une police qui ne les a pas, comme JetBrains Mono, les laisse à la police d’émojis : avec font_family = "JetBrains Mono", ❤️ est rouge. Les panneaux, l’aperçu en direct, l’aperçu complet et un export le dessinent en couleur, quelle que soit la police de votre texte.

Un nom qui ne correspond à aucune police de la machine est signalé, dans la barre d’état, et l’éditeur continue avec la police qu’il avait. Se rabattre en silence, c’est le meilleur moyen de passer un après-midi à se demander pourquoi un réglage n’a rien fait.

N’importe quelle police installée convient — il s’agit des noms de famille tels que votre système les liste, pas de chemins de fichiers.

Réglages et langue

Ctrl+, (Éditeur › Fichier de réglages) ouvre ~/.config/kaivalya-editor/settings.toml ; chaque option y dit ce qu’elle fait. Enregistrez, puis relancez l’éditeur. Éditeur › Réinitialiser le fichier de réglages remet les valeurs par défaut et garde les vôtres dans settings.toml.bak. locale ("en-US" ou "fr-FR") choisit la langue de l’éditeur ; sans valeur, elle suit $LANG. Voir Modifier un réglage et Tous les réglages.

Annexes

Trois listes, chacune sur sa propre page, écrites à partir des tables de l’éditeur lui-même à chaque construction du site — elles disent donc exactement ce que fait cette version.

Tous les réglages

Chaque option du fichier de réglages : à quoi elle sert, et sa valeur si vous n’y touchez pas. Tous les réglages →

Raccourcis clavier

Toutes les commandes, leurs raccourcis et le menu où les trouver. Raccourcis clavier →

Le catalogue de la palette /

Tout ce que propose la palette /, ce que chaque entrée insère, et les autres mots qui la font apparaître. Le catalogue de la palette / →