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.
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 -9ou 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
PATHet 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 externesim --plainn’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 afficheplain.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
sims’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-ptrouve des fichiers par correspondance approximative sur le chemin, classés selon la qualité de la correspondance et la probabilité que vous ouvriez chacun.Ctrl-fcherche dans le contenu de tous les fichiers au fil de la frappe (avec ripgrep s’il est dans lePATH), résultats regroupés par fichier, avec un aperçu de la ligne sélectionnée.Escremet 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.TabetShift-Tabpermettent 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é
siest fondu danssim: une commande pour installer et une pour exécuter. Le cœur est une bibliothèque,sim-editor-core, sur laquellesimest construit.sim --versionetsim --helpaffichent leur résultat puis quittent sans toucher au terminal.Spécification:
Choisir un onglet par une lettre
<Space>bpplace une lettre sur chaque onglet, et la lettre mène directement à son fichier.<Space>bcfait de même pour en fermer un, et ne ferme jamais un fichier modifié. Une astuce nommeTabetShift-Tabla 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>gemontre l’arborescence avec seulement les fichiers qui diffèrent deHEAD, 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 deHEADd’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.
zhdé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>ummontre 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.
zlles 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 ;
ziles 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_COLORet 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 quezia 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,:set plages, sans les bizarreries de vi :Ycopie jusqu’à la fin de la ligne,Urétablit,Ctrl-senregistre etqquitte. 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 :
xetddn’é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 commed) ouvre une petite fenêtre qui liste les touches qui peuvent suivre. Continuer à taper fonctionne exactement comme sans la fenêtre.Spécification:
:helpet F1 : une liste consultable de toutes les touches:helpetF1ouvrent une liste consultable de chaque touche et commande, avec un aperçu de ce que fait chacune.:help tabtrouveTab,Shift-Tabet<Space>bp. La liste est l’unique table des touches du produit : elle ne peut donc pas s’écarter des touches.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à"zgardent du texte et"Aà"Zs’y ajoutent ;"0est le dernier yank,"1à"9les dernières suppressions, et"_prend n’importe quoi sans rien garder.:registersles 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àmzposent une marque dans le fichier ;'ava à 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:marksles liste. Les marques ne vivent qu’en mémoire.Spécification: VI-17
:tutorEnviron 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.