Quand vos doigts frappent Esc : les raccourcis vim pour le composer de la CLI Hermes (et le nom de branche dans votre barre de statut)

Vous avez tapé un long prompt dans Hermes, et juste avant d’appuyer sur Entrée vous remarquez un mot mal orthographié au milieu. Vos doigts pressent Esc puis dd — et le composer ne fait absolument rien. Dans les bindings emacs par défaut, Esc n’est pas « quitter le mode insertion » ; c’est une touche d’annulation/effacement, et dd devient simplement deux caractères de texte. Si vous avez passé dix ans dans vim, cette demi-seconde de friction est difficile à expliquer à qui ne l’a pas vécue.
Il existe désormais une réponse officielle. Le composer classique de la CLI peut utiliser les raccourcis vi/vim — et la configuration est plus modeste que vous ne l’imaginez : une clé de configuration, et aucune nouvelle commande slash.
L’activer : display.vim_mode
Ajoutez une ligne sous la section display de ~/.hermes/config.yaml :
display:
# CLI uniquement : raccourcis vi/vim dans le composer de saisie (Esc → NORMAL, i → INSERT)
# Le mode NORMAL / INSERT / REPLACE en direct s'affiche à droite de la barre de statut.
# Configuration uniquement, lu au démarrage.
vim_mode: true
Ensuite ouvrez votre config avec hermes config edit (ou votre propre éditeur), enregistrez, et redémarrez Hermes.
Un piège à écarter tout de suite : il n’y a pas de commande slash /vim. Une première itération de cette fonctionnalité en livrait une avec les sous-commandes on|off|status, mais elle a été retirée avant la fusion — pour une bonne raison. Ses voisines (/statusbar, /battery, /timestamps) basculent des éléments d’affichage pour le moment, tandis que les raccourcis clavier sont une habitude d’édition, et les lier à la configuration est plus cohérent que de les faire basculer session par session. Donc si vous voyez /vim on mentionné quelque part ailleurs, c’est l’état intermédiaire abandonné — le taper ne fait absolument rien.
Ce que ça donne vraiment
Le comportement correspond à ce que vos doigts attendent :
- Esc entre en mode NORMAL, où les touches sont des commandes et non du texte ;
i(oua,o, et compagnie) revient en mode INSERT pour la frappe ordinaire ;- la barre de statut affiche le mode courant sur son bord droit — l’un de
NORMAL,INSERTouREPLACE. C’est réellement utile, pas décoratif : dans un prompt multiligne, oublier dans quel mode on se trouve constitue la petite contrariété classique, et un libellé permanent supprime la plupart des moments « pourquoi rien ne se passe quand je tape ».
Ce libellé est en direct : il suit vos pressions sur Esc et i plutôt que d’être figé au démarrage. Sous le capot, la barre de statut le construit dynamiquement à partir du mode d’édition courant (_vim_mode_label dans cli_status_bar_mixin.py).
Et si vous n’avez jamais utilisé vim ? La valeur par défaut est désactivée, ce qui conserve les bindings emacs standard de prompt_toolkit — ne changez rien, ne remarquez rien. Cette posture opt-in explique justement pourquoi la fonctionnalité est arrivée sous forme d’un simple interrupteur de configuration.
Un compagnon qui vaut la peine : votre branche git courante dans la barre de statut
Tant que nous sommes sur la barre de statut, il existe un second champ « désactivé par défaut, à activer délibérément » : la branche git courante.
Sur une machine avec plusieurs dépôts et worktrees, « sur quelle branche cette session est-elle réellement » est une question fréquente et lourde de conséquences — surtout après qu’un agent a modifié des fichiers pour vous et que vous voulez être sûr de la branche qui a encaissé. Épinglez-la à la barre de statut et elle reste toujours à un coup d’œil :
display:
status_bar:
# Non vide = seuls ces champs s'affichent (ordre intégré conservé ; la
# configuration contrôle la visibilité, pas l'ordre). Liste vide = jeu par défaut.
fields: ["model", "git_branch", "duration"]
Les champs disponibles incluent model, context_pct, cache_hit, latency, tps, compressions, bg_tasks, bg_subagents, goal, git_branch (affiché comme ⎇ branch), duration, focus, yolo, battery, title et total_tokens. Deux règles comptent :
- Une liste non vide est une liste blanche : seuls les champs que vous nommez s’affichent ; une liste vide restaure le jeu par défaut. L’ordre reste intégré — la configuration ne décide que de la visibilité.
- Les terminaux étroits suppriment des champs automatiquement. Quand la fenêtre se resserre, les champs larges comme
context_detail,prompt_elapsedetidle_sincesont retirés plutôt que comprimés. C’est le comportement voulu, pas une config cassée.
Si vous voulez simplement basculer la barre de statut elle-même, /statusbar s’en charge ; la liste des champs relève de la configuration.
Mises en garde
- Redémarrez après modification.
vim_modeest lu au démarrage, donc une modification de config à chaud ne basculera pas le mode dans une session déjà en cours. - Cela ne touche que le composer. Le changement s’applique à la zone de saisie où vous tapez vos prompts, pas à toutes les autres surfaces d’interaction, et certainement pas à la façon dont l’agent travaille.
- Spécifique à la CLI. Les raccourcis appartiennent au composer classique de la CLI ; l’application desktop et les autres surfaces TUI ont leur propre logique de saisie. N’attendez pas qu’un seul interrupteur les change toutes.
- Ce n’est pas tout vim. Il s’agit du mode d’édition vi de prompt_toolkit : déplacement, suppression, entrée en mode insertion — l’édition quotidienne, pas une session Neovim avec plugins et registres élaborés.
- La fonctionnalité a un précédent. La demande d’origine est l’issue #4254, et à peu près au même moment le CLI GitHub Copilot a rendu son vim mode disponible en général (ses notes v1.0.84-2 citent à la fois une commande
/vimet un réglageeditorMode). Les deux projets s’accordent sur le point de fond : les habitudes d’édition en terminal méritent d’être respectées.
Si vous peaufinez votre installation CLI, trois articles connexes ici valent une lecture : le guide de la palette de commandes Ctrl+P, l’analyse approfondie des métriques de la barre de statut et la suppression du plafond max-turns pour les longues sessions. Monter une machine de zéro commence par le guide d’installation.
La version courte
Une phrase : vous voulez les touches vim ? Écrivez display.vim_mode: true et redémarrez — et ne cherchez pas une commande /vim, il n’y en a pas.
Trois choses à emporter :
- Désactivé par défaut, donc rien ne change tant que vous ne le demandez pas ; une fois activé, la barre de statut affiche en permanence NORMAL / INSERT / REPLACE.
- Envisagez d’ajouter
git_branchàdisplay.status_bar.fields— dans un environnement multi-branches, cela évite toute une classe d’erreurs bêtes. - Ce changement a été fusionné après le tag v0.21.2, donc il vit actuellement sur
mainplutôt que dans une version étiquetée ;hermes updaterécupèremain, ou attendez la prochaine version.
Pour quiconque amène sa mémoire musculaire vim dans le terminal, c’est un petit changement que vous utiliserez plusieurs fois par jour.