sim editor · Rust · Linux et macOS

Le Vim nouvelle génération. Il montre ce qui est caché.

sim est le Vim nouvelle génération : écrit à partir de zéro en Rust, il conserve l’édition modale et les touches de base de Vim.

Il ne lit aucune modeline, ne charge aucun plugin et n’ouvre aucune connexion réseau, et il met à l’écran ce qui reste d’ordinaire caché : caractères invisibles, écritures venues de l’extérieur de l’éditeur, dépôts qui exécuteraient du code.

Pas de plugins. Pas de modelines. Pas de réseau.

Gratuit et open source (MIT OR Apache-2.0). Installez-le via Homebrew, ou bien compilez-le depuis les sources. Notes de version: v0.2.0

sim affichant notes/access.py. Les lignes contenant un forçage de droite à gauche et des caractères d’isolation les montrent sous la forme <U+202E> et <U+2066> sur des blocs magenta. Une espace en fin de ligne apparaît sous forme de trois points, une espace insécable sous forme d’une petite boîte.
Un véritable U+202E et le texte littéral <U+202E> sur une même ligne : seul le vrai caractère reçoit le bloc magenta. En dessous, une ligne dans le style de Trojan Source, une espace en fin de ligne (·) et une espace insécable (⍽). L’arborescence affiche l’état git ; la marge affiche les changements par rapport à HEAD.

Une règle : montrer ce qui est caché

La plupart des attaques passant par un éditeur fonctionnent parce que l’éditeur présente un fichier comme autre chose que ce qu’il est. L’apparence de sim (depth, brouillard, diffs en rouge et vert, badge d’alerte magenta) n’a qu’une raison d’être : rendre visible ce qui est caché. La couleur obéit à une règle fixe : une couleur signifie toujours la même chose.

Ce que signifie chaque couleur

  • GrisLes gris neutres et l’épaisseur du trait portent la structure : texte, numéros, icônes, bordures.
  • BleuL’unique couleur d’accent signifie « ici, agissez » : le mode, l’onglet courant, une occurrence de la recherche, un lien.
  • Vert, ambre, rougeLe vert, l’ambre et le rouge signifient un changement, et rien d’autre.
  • MagentaLe magenta ne signale que ce qui est caché ou dangereux : un caractère qui n’est pas affiché tel quel, git non exécuté par sécurité.

Ce que sim met à l’écran

Cinq choses que les fichiers et les dépôts cachent. sim les montre toutes.

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

    Un forçage de droite à gauche ou une espace de largeur nulle est dessiné sous la forme <U+202E> ou <U+200B> sur un bloc magenta, dans tous les états, et n’est jamais envoyé tel quel au terminal. Le texte littéral <U+202E> ne reçoit aucun bloc : on peut donc distinguer les deux.

    En savoir plus: Les caractères invisibles et bidirectionnels sont montrés

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

    Les espaces en fin de ligne s’affichent 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.

    En savoir plus: Les blancs qui ne ressemblent à rien sont signalés

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

    Quand un autre processus réécrit le fichier ouvert, sim signale ce qui a changé dans le texte, sur l’onglet et dans l’arborescence, et un enregistrement n’écrit rien si le fichier a changé depuis que vous l’avez lu.

    En savoir plus: Les écritures venues de l’extérieur sont signalées

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

    Des signes dans la marge, une lettre d’état pour chaque fichier de l’arborescence et +n ~n -n dans la ligne d’état, le tout issu de git et exécuté en arrière-plan.

    En savoir plus: Les écarts avec git HEAD en un coup d'œil

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

    La configuration propre d’un dépôt ne peut pas faire exécuter une commande à git : un moniteur, des hooks et des filtres sont désactivés, et là où la configuration pourrait encore en exécuter une (core.sshCommand, un include) git n’est pas exécuté. Le cadre dit de quoi il s’agit, et la ligne d’état indique la clé et le fichier.

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

sim dans un terminal

sim affichant store.py après une écriture externe. Deux lignes modifiées sont sur fond vert, la bordure supérieure porte un badge vert, 2 changes on disk, et l’onglet affiche ↯.
Un autre processus a réécrit le fichier ouvert. Les lignes modifiées sont signalées, l’encadré indique « 2 changes on disk » (2 modifications sur le disque), l’onglet affiche ↯ et rien n’a été perdu dans le tampon.
Une fenêtre flottante intitulée Live grep au-dessus de l’arborescence du projet, listant les lignes trouvées regroupées par fichier, avec en dessous un aperçu coloré selon la syntaxe.
Ctrl-f cherche dans le contenu de tous les fichiers au fil de la frappe, avec un aperçu de la ligne sélectionnée.
sim affichant README.md avec des titres sur des bandeaux, un bloc de code délimité, un tableau aligné avec des barres, une liste de tâches et une barre de citation ; la première ligne, où se trouve le curseur, montre son # tel qu’il a été tapé.
Un README dans la vue de lecture : des titres, un tableau aligné sur la largeur d’affichage, une liste de tâches et une citation, dessinés comme ils se lisent. La ligne où se trouve le curseur est le texte du fichier lui-même.
sim dans un dépôt dont la configuration définit core.sshCommand. Le bord supérieur de l’encadré de l’arborescence porte un badge magenta, git not run, et la ligne d’état dit : git skipped: core.sshcommand in .git/config could run a command.
Dans un dépôt dont le .git/config définit core.sshCommand, sim n’exécute pas git : l’encadré de l’arborescence dit git not run, et la ligne d’état indique la clé et le fichier.

Rapide. Mesuré, pas seulement affirmé.

Dans le benchmark du projet lui-même (build de release, fichier de 100 000 lignes, panneau ouvert, coloration syntaxique activée), une touche prend moins de 1 ms au p99. 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.

Mesuré par le projet sur un AMD Ryzen 9 9950X (SPEED-1, SPEED-2 dans sa spécification). Votre machine donnera d’autres résultats.

Face à Vim, Neovim et Helix

Un tableau sourcé : plugins, modelines, configuration de projet, caractères cachés et écritures externes. Il indique aussi ce que les autres font encore mieux.

Lire la comparaison

Feuille de route

Prévu, pas encore livré. Rien de ce qui figure ici n’est disponible aujourd’hui.

  • Macros

    Prévu

  • Intégration du presse-papiers

    Prévu

  • Serveurs de langage, dans un bac à sable

    Prévu

  • Une interface graphique avec une vraie profondeur

    Prévu

  • Autres façons d’installer

    Prévu

Toutes les fonctionnalités prévues

Lancez le Vim nouvelle génération

Installez-le via Homebrew, ou bien compilez-le depuis les sources. Les paquets pour AUR et crates.io seront bientôt disponibles.