À la recherche du système d'édition de texte et de code parfait

Ça fait un moment que je suis frustré quand j’écris des textes ou édite du code, et je suis donc à la recherche de meilleures façon de faire. Je vais donc documenter dans ce thread mes réflexions et découvertes, en espérant que l’on puisse m’apporter des éléments supplémentaires et que ce thread serve aux personnes qui se posent les même questions.

Un peu de mon histoire personnelle avec l’édition
En passant sur l’utilisation des suite de bureautique, on peut dire que mon premier éditeur de texte était Notepad++. Avec SublimeText2 et Geany ensuite (ce dernier utilisé en tant qu’IDE léger), le principe est simple : des onglets pour gérer les différents fichiers ouverts, éventuellement un exploreur de fichiers sur le côté, et une édition du texte avec la souris et la touche Del.
L’étape suivante a été de commencer à utiliser Vim, pas pour des raisons particulières, mais plus parce que c’est ce qui était conseillé sur pas mal de tutoriels Linux (ce qui n’est pas forcément pertinent, mais passons). Rapidement, l’utilisation des touches de déplacement sur la position de repos est devenu une habitude, ce qui a été exacerbé au moment où j’ai changé de disposition de clavier pour passer à Bépo.
Finalement, après avoir vu cette vidéo, je suis passé sur Emacs (et plus particulièrement Spacemacs) afin d’avoir une véritable expérience d’IDE (si Vim peut être étendu pour en faire un IDE, son extension me semble moins naturelle que celle d’Emacs), et enfin sur ma propre configuration d’Emacs, avec Evil pour émuler le comportement de Vim.

Mes problèmes avec vim
Un des premiers problèmes que j’ai rencontré avec Vim vient de la disposition Bépo que j’utilise. Vim utilise les touches hjkl pour le déplacement, afin que les mains puissent rester en position de repos. En Bépo, les touches correspondantes sont ctsr, il faut donc reconfigurer les touches. Si reconfigurer 8 touches est relativement simple à faire, d’autres problèmes se posent : la composition de touches (gj pour descendre d’une ligne affichée) doit aussi être remappée et surtout certaines touches facilement accessible avec une disposition Azerty deviennent peu confortables à utiliser (par exemple $ pour aller à la fin de la ligne, qu’il faut aller chercher avec l’auriculaire droit). De manière plus générale, Vim réfléchit peu à l’ergonomie, et utilise plutôt des moyens mnémotechniques pour choisir les actions des touches.

xah-fly-keys, le système d’édition le plus efficace de l’univers ?
C’est la prétention de ce package Emacs, dont les commandes du mode normal sont visibles ci-dessous. L’idée est non pas d’associer des commandes par moyens mnémotechniques, mais par fréquence d’utilisation. Les actions fréquentes comme se déplacer mot par mot se retrouvent donc proches de la position de repos, ce qui permet un confort plus grand lors de l’édition de texte.

Le problème de ce système est qu’il ne permet pas de mettre en place un « langage d’édition », comme avec Vim : dw pour supprimer le mot qui suit, ou yfw pour copier jusqu’au caractère w.

Kakoune pour un meilleur langage d’édition
En me renseignant sur des alternatives à Vim, je suis tombé sur Kakoune, qui a lui aussi un langage d’édition. L’idée est, contrairement à Vim où on écrit l’action (d pour supprimer, y pour copier) puis l’objet sur lequel s’applique l’action, d’écrire l’objet qui est alors selectionné, et seulement après d’écrire l’action.
Cette idée m’a rappelé quelque chose que je fais très souvent avec Vim, qui consiste à passer en mode Visual, sélectionner une partie du texte, et enfin d’effectuer mon action sur ce qui a été sélectionné. Kakoune revient à faire cela, avec moins de touches pressées.

Mnémotechnique contre ergonomie
Malheureusement, Kakoune continue d’utiliser des touches similaires à celles de Vim, au détriment de l’ergonomie/du confort d’édition. Il serait possible de remapper toutes les touches afin d’avoir quelque chose qui soit le plus ergonomique possible, mais est-ce que cela vaut le coup. Cela revient à poser la question : vaut-il mieux optimiser au maximum son confort et l’ergonomie de son éditeur de texte au risque de passer beaucoup de temps à le maîtriser, ou vaut-il mieux reposer sur la mnémotechnique pour que l’apprentissage soit plus facile ?

Vu que ce genre de question touche essentiellement aux préférences personnelles, je vais me contenter de présenter mon setup actuel et d’expliquer certains choix. Chacun y piochera ce qu’il veut et sera plus ou moins réceptif aux différents arguments.

Description rapide de mon setup
Clavier : Vieux clavier classique
Disposition clavier : BÉPO avec Esc et VerMaj échangés (pour Vim comme Kakoune, Esc est très utilisé)
Éditeur : Kakoune

Se déplacer avec un Bépo
Comme tu l’as décrit, c’est la galère d’utiliser une disposition non-AZERTY/QWERTY pour se déplacer. Sur Bépo, la position des touches hjkl ne sont pas du tout pratiques ou logiques. On veut pouvoir se déplacer sur la « main row » (là où les doigts sont au repos sur un clavier). Mais comme tu l’as souligné, remapper toutes ses touches a plusieurs inconvénients :

  • Quand on cherche des infos ou quand on récupère des scripts tiers, il faut « traduire » les réponses vers notre nouvelle disposition (« ah oui, c’est vrai, il dit d’appuyer sur d, mais moi j’ai échangé les effets de d et i pour que ce soit plus pratique… »)
  • Il faut reconfigurer TOUS ses outils. Il n’y a pas que l’éditeur qui dispose de raccourcis claviers comme Vim : par exemple pour naviguer d’une fenêtre à une autre, avec i3 ou tmux, et j’aime avoir un environnement uniforme, que mes raccourcis soient cohérents entre mes différents outils et plateformes.

La solution que j’ai trouvée c’est les modificateurs de touches. Si mes touches hjkl ne sont pas au bons endroits, j’aimerais que Mod + ctsr soit équivalent à hjkl(car en Bépo, ctsr sont là où hjkl sont sur un Azerty). Comme ça, quand je veux me déplacer avec hjlk, je maintiens mon modificateur Mod et j’utilise ctsr, un peu comme si ma touche Mod était un changement temporaire de disposition de clavier.
Le problème à cette solution, c’est que tous les modificateurs sont déjà utilisés par d’autres trucs : Ctrl, Alt, Super, AltGr… et que je n’ai pas envie de devoir me casser les articulations en essayant de faire des combinaisons Ctrl + Alt + AltGr pour me déplacer.
Du coup, j’ai décidé de créer une nouvelle touche de modificateurs. Ainsi, maintenant ma touche Esc a deux utilités : si je l’appuie normalement, c’est un Esc classique. Mais si je l’appuie en combo avec une autre touche, ça devient un modificateur. Ainsi, Esc + ctsr écrit hjkl. Et je suis certain que aucun autre programme n’utilise ce modificateur. Je suis donc à peu près safe là dessus.

Et de la même façon, avec toutes les touches mnémotechniques, on peut les rapprocher des rangées centrales pour les rendre plus facilement utilisables.

Quelques soucis avec cette methode :

  • Marche parfois mal en SSH : certains clients interceptent la touche Esc, et donc foutent en l’air mes combinaisons
  • Il faut manuellement mapper ce nouveau Mod et toutes les combinaisons, c’est donc un setup custom à faire sur toutes mes machines, et c’est pas très très stable

Changer de clavier : la solution miracle ?
Plusieurs claviers proposent justement des touches custom, des modificateurs personnalisés, 100% personnalisables. Je pense à Ergodox et leurs différents claviers mais il y en a bien d’autres. Ces claviers gèrent les inputs directement dans le clavier : plus de conflit avec certains programme qui interceptent les touches : le clavier n’envoie pas Mod + t (qui peut être intercepté, modifié, mal interprété,…), il envoie directement j parce qu’on l’a configuré ainsi.

Conclusion : mnémotechnique et praticité, faire les deux
L’approche est donc double : garder les raccourcis initiaux des différents outils, mais les rapprocher pour qu’ils aient du sens et soient plus pratique. Et pour éviter d’avoir un clavier qui ne ressemble à rien, rajouter des modificateurs.
Ainsi, sans modificateur, mon clavier est un Bépo, mais Esc transforme ce clavier en une nouvelle disposition où les touches sont aux endroits où elles ont du sens