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 :

- 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_orderet*_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.
- Tapez
- laitpuisEntrée: un nouveau-vous attend. Entréesur cet élément vide : il remonte d’un niveau.Entréesur 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~Oreste tel qu’écrit. - Réglages :
tab_size,insert_spacesetline_widthvalent pour tous les langages ;format_wrap_text = truerecoupe 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.
- Ouvrez un document markdown et choisissez Fichier › Vérifier l’orthographe.
- Corrigez un mot : les soulignements se mettent à jour à chaque pause de la frappe.
- 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-2et 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à.

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 —
/biduleest 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,Échapcommence 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

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,234et12%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_sizeest 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

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.
- Tapez dans l’éditeur, ou cliquez sur une structure pour l’insérer.
- 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

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

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 (→), 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/emojiet de/symboleest É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 — →, ©. 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 (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 ;0le 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_keepetlocal_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, 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

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 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.

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.nameetuser.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 dansgit reflog, comme depuis un terminal. - Nouvelle branche… ouvre un champ sous l’en-tête : tapez le nom puis
Entrée. C’estgit 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 versorigin, et configurée pour le suivre —git push -u. S’il y a plusieurs dépôts distants et qu’aucun ne s’appelleorigin, 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’é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.
est cherché à partir du dossier du document, comme partout ailleurs. -
Les diagrammes. Un bloc délimité marqué
mermaidest 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
.htmlet 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,FreeSerifouFreeMonoobtient 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 :
- Celle que vous choisissez dans cette liste, pour ce document, sur cette machine.
- Celle du document, dans son en-tête :
css: ./maison.css. - Une règle pour tout un dossier, dans
.kaivalya/project.toml. - 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

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

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-07dans Au désigne la fin de ce jour,13:05la 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 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,imagespar 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, puisEntrée(example.orgdevienthttps://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>_sidele met à gauche ou à droite — pour l’explorateur, les fichiers ouverts, la recherche, TODO, git, le plan, markdown, les caractères et les couleurs.rail_orderest l’ordre des icônes, une seule liste pour les deux bords ;rail_icon_sizeleur taille ;peek_on_hover = falsefait 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 | \*, & et { — 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
highlightsuit le format de Zed. Le code source de la boîte à outils indique que cette section assure la « compatibilité avec la sectionstyledes 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
syntaxet 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 / →