Ce que sim fait aujourd’hui

Ce que sim fait aujourd’hui, regroupé selon son usage. Chaque fonctionnalité liste les identifiants d’exigences de la spécification du projet qui l’étayent. Les fonctionnalités prévues figurent uniquement dans la feuille de route.

Montre ce qui est caché

L’idée centrale : un fichier est montré tel qu’il est.

  • Les caractères invisibles et bidirectionnels sont montrés

    Un forçage de droite à gauche, une espace de largeur nulle ou un caractère de contrôle est dessiné sous la forme <U+202E>, <U+200B> ou ^[ sur un bloc magenta, dans tous les états où une cellule peut se trouver : sélectionnée, trouvée par une recherche, sur la ligne du curseur, dans une modification venue de l’extérieur, dans le brouillard d’une ligne éloignée. Aucun n’est jamais envoyé tel quel au terminal. Le texte littéral <U+202E> dans un fichier ne reçoit aucun bloc : on peut donc distinguer les deux.

    Spécification: SAFE-8, UI-15

  • Les blancs qui ne ressemblent à rien sont signalés

    Les espaces en fin de ligne sont dessinées en ·, une espace insécable en ⍽ et une tabulation en » : des signes qu’aucun code n’utilise, dessinés par-dessus le texte sans jamais en faire partie. Il n’y a aucun signe pour la fin d’une ligne, et - et % ne sont pas utilisés, car ce sont des caractères ordinaires du code.

    Spécification: UI-6

  • Les écritures venues de l’extérieur sont signalées

    sim surveille le fichier ouvert. Quand un autre processus le réécrit (une compilation, un formateur, un outil), les lignes modifiées sont signalées dans le texte, l’encadré indique combien de modifications sont sur le disque, l’onglet affiche ↯ et l’arborescence marque le fichier. Un enregistrement compare d’abord l’empreinte (hash) du fichier et n’écrit rien s’il a changé depuis que vous l’avez lu. Une écriture au même instant exact que cette vérification peut encore passer (voir Sécurité).

    Spécification: DISK-1, DISK-2, DISK-6, SAFE-5, UI-4, MARK-1

  • Les écarts avec git HEAD en un coup d'œil

    Des signes dans la marge pour les lignes ajoutées, modifiées et supprimées, une lettre d’état sur chaque fichier de l’arborescence (M, A, U, D, R) et, sur un dossier, la lettre de l’état le plus fort qu’il contient, la branche et +n ~n -n dans la ligne d’état. Tout vient de git, exécuté en arrière-plan et jamais sur le chemin d’une touche.

    Spécification: UI-3, UI-5, UI-10

  • La configuration propre d’un dépôt ne peut pas faire exécuter une commande à git

    Avant d’exécuter git, sim lui demande la configuration propre du dépôt. Ce qu’une ligne de commande peut arrêter est désactivé : un moniteur du système de fichiers, des hooks, des filtres, un diff externe et une conversion de texte n’exécutent rien, et l’arborescence dit combien de réglages ont été désactivés (2 git settings off). Si la configuration pouvait encore exécuter une commande que rien n’arrête (core.sshCommand, un include qui pourrait en apporter une, et d’autres), git n’est pas exécuté : l’arborescence n’affiche aucune marque git et dit git not run, et la ligne d’état indique la clé et le fichier. git s’exécute sans shell, sans verrous facultatifs et sans aucun moyen de récupérer quoi que ce soit.

    Spécification: MARK-1, GIT-1, GIT-2, GIT-3, GIT-5

  • Tout ce qui ne se dessine pas est montré

    En plus du forçage de droite à gauche et de l’espace de largeur nulle, sim montre les caractères de balise (la façon de glisser une instruction à un assistant d’IA), les sélecteurs de variante (la façon dont du code a été caché dans des extensions publiées), les remplisseurs hangul, les traits d’union conditionnels, les séparateurs de ligne et tout point de code non attribué sous la forme <U+E0041>, partout où il dessine du texte : le fichier, la ligne d’état, les messages et les noms dans l’arborescence et les onglets. Les séquences d’émojis, les touches à cadre, les drapeaux de l’Angleterre, de l’Écosse et du pays de Galles et les icônes de Nerd Font restent comme ils sont. Un kanji suivi d’un sélecteur de variante idéographique montre le sélecteur.

    Spécification: SAFE-10, SAFE-11

  • Le bloc d’alerte marque plus que des caractères

    Le magenta signifie que quelque chose mérite un second regard. En plus des caractères cachés, un lien Markdown dont le texte ressemble à une adresse que sa cible n’est pas ([https://good.example](https://evil.example)) a sa cible dessinée sur le bloc, et l’arborescence écrit git not run dessus pour un dépôt où git n’a pas été lancé par sécurité.

    Spécification: UI-15, MD-10, GIT-5

Refuse ce qu’il doit refuser, conserve votre texte

Aucun texte n’est perdu sans une action explicite, et les fichiers ne peuvent pas reconfigurer l’éditeur.

  • Pas de modelines, pas de fichiers de configuration, pas de plugins

    Les réglages et les commandes ne sont jamais lus dans le contenu d’un fichier : un fichier ne peut donc pas reconfigurer l’éditeur. Il n’y a aucun fichier de configuration à charger depuis un dépôt, aucune API de plugins, et sim n’ouvre aucune connexion réseau. Les seules choses dont il se souvient sont votre apparence, votre choix d’icônes et votre vue Markdown, un mot chacun.

    Spécification: SAFE-9

  • Des enregistrements qui ne peuvent pas être à moitié écrits

    Un enregistrement écrit un fichier temporaire à côté de l’original (créé avec le mode 0600 et O_EXCL), le synchronise avec fsync, le renomme par-dessus l’original puis applique fsync au répertoire : vous voyez l’ancien fichier ou le nouveau, jamais un mélange. Un fichier appartenant à un autre utilisateur, ayant des liens physiques ou situé dans un répertoire en lecture seule est enregistré sur place, après une copie de récupération. sim refuse d’écrire à travers un lien appartenant à un autre utilisateur. Ouvrir puis enregistrer sans modifier produit une sortie identique octet pour octet.

    Spécification: SAFE-1, SAFE-2, SAFE-3, SAFE-5

  • Rien n’est perdu en cas de plantage

    Les modifications non enregistrées sont sauvegardées en instantané au plus une fois par seconde dans un répertoire d’état privé (0700). Après un plantage, un kill -9 ou la fermeture du terminal, rouvrir le fichier les propose de nouveau, sous la forme d’une seule étape d’annulation. Au plus une seconde de travail est perdue.

    Spécification: SAFE-6

  • La recherche n’exécute jamais ce que le dépôt contrôle

    sim trouve lui-même ripgrep parmi les entrées absolues de PATH et l’exécute avec un environnement vide et --no-config, jamais avec --pre : un dépôt ne peut donc pas faire exécuter son code par une recherche. Une recherche n’écrit jamais rien et ne suit jamais un lien symbolique hors du projet.

    Spécification: GREP-7, GREP-8

  • Les fichiers qui ne sont pas du texte s’ouvrent en lecture seule

    Un fichier qui n’est pas de l’UTF-8 valide, ou qui contient un NUL dans ses 8 premiers Ko, s’ouvre en lecture seule avec la raison affichée, et les octets invalides sont dessinés en U+FFFD. Les modifications et les écritures sont refusées, car le texte à l’écran ne serait pas le fichier.

    Spécification: SAFE-4

  • Un enregistrement en conflit conserve les deux versions

    Quand un enregistrement constate que le fichier a changé sur le disque, rien n’est perdu d’un côté comme de l’autre. :w! conserve votre version après avoir copié celle du disque dans le répertoire d’état, et :e! adopte celle du disque après un instantané de la vôtre.

    Spécification:

  • --plain : aucun processus externe

    sim --plain n’est que le cœur, avec l’apparence calm, un seul fichier, aucun panneau et aucun programme externe : ni git, ni ripgrep, ni filtre, ni hook. C’est le mode par défaut en root et comme éditeur de sudoedit, et la ligne d’état affiche plain.

    Spécification:

Accès et vitesse

Le moins d’étapes possible entre « ce fichier » et sa lecture.

  • Une arborescence de projet qui ne bouge jamais

    sim s’ouvre sur l’arborescence du répertoire courant. Les répertoires viennent d’abord, puis les fichiers, chacun par nom, toujours dans le même ordre, et le dépliage reste comme vous l’avez laissé : on trouve les fichiers par leur position plutôt qu’en lisant. Les répertoires sont lus en arrière-plan : les entrées apparaissent à mesure qu’elles arrivent, sans rien déplacer au-dessus d’elles.

    Spécification: TREE-1, TREE-3, TREE-4, TREE-5

  • Trouver des fichiers et du texte dans une fenêtre flottante

    Ctrl-p trouve des fichiers par correspondance approximative sur le chemin, classés selon la qualité de la correspondance et la probabilité que vous ouvriez chacun. Ctrl-f cherche dans le contenu de tous les fichiers au fil de la frappe (avec ripgrep s’il est dans le PATH), résultats regroupés par fichier, avec un aperçu de la ligne sélectionnée. Esc remet tout comme avant.

    Spécification: FIND-2, FIND-4, GREP-1, GREP-5, PICK-1

  • Les fichiers probables sont marqués là où ils sont

    sim retient les fichiers que vous ouvrez et les classe selon leur récence et leur fréquence combinées. Les cinq plus probables sont marqués d’un • dans l’arborescence. Une touche, ., restreint l’arborescence aux fichiers modifiés, ouverts ou ouverts récemment.

    Spécification: MARK-2, MARK-3

  • Plusieurs fichiers, un éditeur complet pour chacun

    Chaque fichier ouvert a son propre historique d’annulation, ses propres instantanés, son propre observateur et ses propres enregistrements. Une barre d’onglets les affiche, avec un ● en gras pour les modifications non enregistrées. Tab et Shift-Tab permettent de passer de l’un à l’autre.

    Spécification: BUF-1, BUF-2, UI-4

  • Assez rapide pour qu’on ne s’en aperçoive pas

    Dans le benchmark du projet (build de release, fichier de 100 000 lignes, panneau ouvert, coloration syntaxique activée), une touche prend au plus 1 ms au p99, sur des écrans de 80×24 à 240×60. Dans un dépôt de 100 000 fichiers, la première image est dessinée avant la lecture de la liste des fichiers : de 1,8 à 8,7 ms mesurées, pour une exigence de 20 ms. Tout ce qui est lent (parcourir une arborescence, interroger git, analyser le code pour la coloration) s’exécute dans un thread d’arrière-plan.

    Spécification: SPEED-1, SPEED-2

  • Un seul binaire : sim

    Le binaire séparé si est fondu dans sim : une commande pour installer et une pour exécuter. Le cœur est une bibliothèque, sim-editor-core, sur laquelle sim est construit. sim --version et sim --help affichent leur résultat puis quittent sans toucher au terminal.

    Spécification:

  • Choisir un onglet par une lettre

    <Space>bp place une lettre sur chaque onglet, et la lettre mène directement à son fichier. <Space>bc fait de même pour en fermer un, et ne ferme jamais un fichier modifié. Une astuce nomme Tab et Shift-Tab la première fois qu’un deuxième fichier est ouvert, jusqu’à ce que vous les ayez utilisées trois fois.

    Spécification:

  • Une arborescence des changements par rapport à git HEAD

    <Space>ge montre l’arborescence avec seulement les fichiers qui diffèrent de HEAD, indexés, non indexés et non suivis, chacun avec sa lettre d’état et +n −n, et chaque dossier avec les totaux. Entrée ouvre la version de HEAD d’un fichier, en lecture seule.

    Spécification: GIT-1, GIT-2, GIT-3, GIT-4, DIFF-1, DIFF-3, DIFF-4

Lecture confortable

Des couleurs et une mise en page calculées, pas devinées.

  • Des couleurs de syntaxe tirées de votre propre palette

    Les couleurs viennent de la palette de votre terminal (lue avec OSC 4). Elles gardent leur teinte mais varient en luminosité jusqu’à ce que le texte atteigne |Lc| 75 par rapport au fond. Les mots-clés sont rouges, les chaînes et les nombres verts, les types jaunes, les fonctions cyan, les commentaires gris en italique ; le bleu et le magenta ne servent jamais pour le code. Le langage est déterminé d’après le nom du fichier, son extension ou sa première ligne, avec le jeu de syntaxes de bat. zh désactive les couleurs.

    Spécification: SYN-1, SYN-2, SYN-4

  • Une vue de lecture Markdown

    Dans un fichier Markdown, chaque ligne sauf celle du curseur est dessinée comme elle se lit : les marques d’emphase et de code ne sont pas dessinées, les tableaux sont alignés sur la largeur d’affichage et les encadrés (> [!NOTE]) montrent le mot de leur type. Seules ces marques sont masquées, jamais un #, un crochet, une URL ni un caractère du texte, et <Space>um montre le texte brut.

    Spécification: UI-8, MD-1, MD-10, MD-11

  • Trois apparences

    Calm est la plus sobre : quatre styles et un fond chromatique. Flat montre un diff en vert et rouge, avec des lignes teintées. Depth, l’apparence par défaut, ajoute des encadrés, une règle d’aperçu général et un brouillard qui estompe le texte selon sa distance au curseur. zl les fait défiler. Calm est l’apparence qu’il faut à quiconque ne distingue pas le rouge du vert.

    Spécification: LOOK-1, LOOK-2, LOOK-3

  • Lisible, mesures à l’appui

    Le texte est à |Lc| 90 et le texte secondaire à |Lc| 60 (APCA), calculés d’après le fond de votre terminal. Avec calm, l’unique couleur de changement reste distinguable avec une vision des couleurs protan, deutan et tritan. Une teinte signifie une seule chose dans toute l’interface : le gris pour la structure, le bleu pour l’endroit où vous agissez, le vert, l’ambre et le rouge pour le changement, le magenta seulement pour ce qui est caché ou dangereux.

    Spécification: VIS-4, VIS-5, COLOR-1, UI-12

  • Un éditeur dans lequel on peut vivre

    Des icônes dans l’arborescence (une Nerd Font est nécessaire ; zi les désactive), une barre d’onglets, un fil d’Ariane comme titre de l’éditeur (src › sim.rs › leader_key), une ligne d’état avec le mode, la branche, les écarts avec HEAD et la position (l’encodage et le type de fin de ligne n’y figurent que s’ils ne sont pas UTF-8 ou LF), des numéros de ligne relatifs, des repères d’indentation, une barre de défilement avec des repères, et un bref flash sur ce que vous venez de copier (yank).

    Spécification: UI-2, UI-5, UI-6, UI-10, UI-11

  • Le japonais et les autres textes CJK

    Les caractères larges occupent deux colonnes, la prose passe à la ligne selon les règles kinsoku du japonais, les déplacements par mot découpent le texte CJK là où l’écriture change, et, avec un IME actif, les touches pleine chasse fonctionnent comme des commandes.

    Spécification: VIS-7, VI-10

  • Fonctionne sans couleur, et jamais par la couleur seule

    NO_COLOR et les terminaux de moins de 8 couleurs dessinent uniquement avec l’épaisseur, le soulignement et la vidéo inverse, et sim ne demande aucune couleur au terminal. Le sens ne dépend jamais de la couleur seule : une ligne modifiée est ┆ dans la colonne des signes, les dossiers affichent la lettre de l’état git le plus fort, et un onglet affiche ↯ pour un fichier modifié sur le disque. Avec les icônes désactivées, aucun glyphe de la zone d’usage privé n’est dessiné.

    Spécification:

  • Les icônes démarrent activées là où une Nerd Font est probable

    Les icônes nécessitent une Nerd Font, et un terminal ne peut pas dire s’il en a une. Elles démarrent activées dans Ghostty, kitty et WezTerm et désactivées ailleurs, avec une astuce affichée une seule fois dans la ligne d’état : zi: icons (needs a Nerd Font). Ce que zi a choisi en dernier l’emporte toujours.

    Spécification:

  • Ce qui est copié s’illumine, dans toutes les apparences

    Ce que vous venez de copier avec yank s’illumine pendant 150 ms. Calm, l’apparence sobre, l’illumine aussi désormais : dans le gris d’une sélection, ou souligné là où il n’y en a pas. Une ligne qu’un autre processus vient d’écrire dans le fichier ouvert s’illumine pendant 400 ms.

    Spécification: UI-13, UI-19

Touches

La grammaire de vi, sans les bizarreries de vi.

  • Les touches de vi que vos mains connaissent

    Déplacements, opérateurs, objets de texte, compteurs, ., mode Visuel, recherche avec smartcase, :s et plages, sans les bizarreries de vi : Y copie jusqu’à la fin de la ligne, U rétablit, Ctrl-s enregistre et q quitte. Les flèches, Home, End et Delete fonctionnent partout.

    Spécification: VI-1, VI-2, VI-3, VI-4, VI-5, VI-6, VI-7

  • Les copies atteignent le presse-papiers du système

    Chaque copie (yank) sans nom de registre est aussi envoyée au presse-papiers du système via OSC 52, y compris dans tmux. Les suppressions et les modifications ne remplissent que le registre : x et dd n’écrasent donc jamais ce que vous avez copié.

    Spécification: VI-8

  • La souris, sans surprises

    Cliquez pour ouvrir un fichier ou placer le curseur, utilisez la molette pour défiler, faites glisser pour sélectionner. La souris ne modifie, n’enregistre ni ne crée jamais d’instantané de son propre chef.

    Spécification: PTR-1, PTR-2

  • Space est la touche leader, avec une fenêtre which-key

    Une pause sur un préfixe (Space, g, z, Z, [, ] ou un opérateur comme d) ouvre une petite fenêtre qui liste les touches qui peuvent suivre. Continuer à taper fonctionne exactement comme sans la fenêtre.

    Spécification:

  • La recherche indique où vous en êtes

    Tant que les occurrences d’une recherche sont mises en évidence, la ligne d’état indique sur quelle occurrence se trouve le curseur et combien il y en a : [3/12].

    Spécification:

  • Registres de Vim

    "a à "z gardent du texte et "A à "Z s’y ajoutent ; "0 est le dernier yank, "1 à "9 les dernières suppressions, et "_ prend n’importe quoi sans rien garder. :registers les liste. Ils ne vivent qu’en mémoire et tous les fichiers ouverts les partagent. Un yank sans nom va toujours au presse-papiers du système via OSC 52 ; une suppression, non.

    Spécification: VI-15

  • Marques

    ma à mz posent une marque dans le fichier ; 'a va à sa ligne et la touche accent grave à son emplacement exact, aussi avec un opérateur (d'a). '' revient là où se trouvait le curseur avant le dernier saut. Une marque suit son texte à travers les modifications, l’annulation et les changements venus de l’extérieur, et :marks les liste. Les marques ne vivent qu’en mémoire.

    Spécification: VI-17

  • :tutor

    Environ quinze minutes de leçons courtes dans un tampon temporaire, dans la langue de vos paramètres régionaux (English, 日本語, 简体中文, 繁體中文, 한국어, Español, Português, Français, Deutsch ou Русский ; English pour toute autre). Les exercices se marquent d’eux-mêmes par ✗ et ✓ pendant que vous tapez.

    Spécification: TUTOR-1, TUTOR-2, TUTOR-3, TUTOR-4

Feuille de route

Prévu, pas encore livré. Rien dans cette liste n’est encore disponible, et l’ordre n’est pas une promesse.

  • Macros

    Prévu

    Enregistrer et rejouer des touches. Aujourd’hui, sim n’en a aucune.

  • Intégration du presse-papiers

    Prévu

    Plus que le yank actuel via OSC 52.

  • Serveurs de langage, dans un bac à sable

    Prévu

    Un client de serveur de langage dont le serveur s’exécute dans un bac à sable et, dans la ligne d’état, un indicateur signalant si la racine du projet est approuvée.

  • Une interface graphique avec une vraie profondeur

    Prévu

    Une interface graphique avec de vraies ombres et de vraies élévations. Elle a démarré sous forme de prototype ; il n’y a rien à installer.

  • Autres façons d’installer

    Prévu

    Les paquets pour AUR et crates.io seront bientôt disponibles.