Commandes
Une action de l'IDE (enregistrer, exécuter, basculer le thème, fusionner une branche…) est décrite une seule fois, comme une Command (src/commands/types.ts). La barre de menus, la palette de commandes et les raccourcis clavier en sont tous dérivés : ajouter une commande la rend disponible partout, avec le même libellé et le même raccourci.
Une commande
| Champ | Rôle |
|---|---|
id | identifiant stable (file.save), utilisé par les menus |
category, title(), icon | affichage (le titre est traduit à chaque affichage) |
keybinding | raccourci(s) en notation CodeMirror : Mod-s, Mod-Shift-f, F1 (Mod = Cmd sur macOS, Ctrl ailleurs) |
keybindingScope | global (défaut), outsideText (pas dans l'éditeur ni un champ : Ctrl+Z), native (affiché seulement : Ctrl+C) |
enabled() | la commande est-elle utilisable (fichier exécutable ouvert…) ? Désactivée : grisée dans les menus, absente de la palette, raccourci sans effet |
checked() | option cochée (thème, langue, police) : menuitemradio dans un groupe, menuitemcheckbox sinon |
run() | l'action |
Le catalogue (catalog.ts) assemble les commandes à partir des stores et des composables (useProject, useGitActions). Ses sources sont réévaluées quand elles changent : une commande par branche Git, par langue, par police.
Registre
App.vue crée le registre (createCommandRegistry(createCommandSources())), le fournit à l'application (provideCommands) et installe les raccourcis (useKeybindings). Un composant y accède par useCommands() et lance une commande par run(id). Dans les tests, withCommands(Composant) (tests/helpers/commands.ts) fournit le registre.
Raccourcis
useKeybindings écoute le clavier en phase de capture, avant les composants et CodeMirror : chaque touche n'a qu'un gestionnaire. Une fenêtre modale ouverte (aria-modal) garde ses touches. Le keymap de CodeMirror ne contient que l'édition elle-même (indentation, historique, commentaire, Échap pour fermer la recherche).
Barre de menus
menus.ts décrit les menus par identifiants de commandes, séparateurs, groupes titrés et sous-menus hiérarchiques ({ submenu: MessageKey, items: [...] }). MenuBar.vue suit le motif WAI-ARIA menubar : un seul élément atteignable par Tab, ←/→ entre les menus de premier niveau, ↓/↑, Entrée ou Espace pour ouvrir, ↑/↓, Début, Fin dans un menu, et → / ← ou Échap pour naviguer dans et hors des sous-menus (Thème, Langue, Police d'écriture). Les raccourcis sont annoncés par aria-keyshortcuts.
Éditeurs
Les commandes d'édition (annuler, copier, rechercher…) s'adressent à l'éditeur du volet actif : chaque CodeEditor enregistre à son montage un EditorController dans le store editor (registerEditor), que editorStore.undo(), openSearch()… appellent directement.
Ajouter une commande
- L'ajouter à une source de
catalog.ts, avec un titre traduit (t('commands.…')). - Si elle doit figurer dans un menu, ajouter son
iddansmenus.ts.
tests/interface/commands.spec.ts vérifie que chaque entrée de menu existe et qu'aucun raccourci n'est attribué deux fois.