diff --git a/www/content/articles/vim_pour_les_ergonautes/adm3a.jpg b/www/content/articles/vim_pour_les_ergonautes/adm3a.jpg new file mode 100644 index 00000000..414f5557 Binary files /dev/null and b/www/content/articles/vim_pour_les_ergonautes/adm3a.jpg differ diff --git a/www/content/articles/vim_pour_les_ergonautes/index.md b/www/content/articles/vim_pour_les_ergonautes/index.md new file mode 100644 index 00000000..f98eaf58 --- /dev/null +++ b/www/content/articles/vim_pour_les_ergonautes/index.md @@ -0,0 +1,300 @@ ++++ +title = "Vim pour les Ergonautes" +date = 2024-08-04T13:16:42+01:00 +author = "kazé" +tags = ["communauté", "vim"] ++++ + + + +J’anime des [ateliers récurrents sur Vim][tupperVim] depuis une douzaine +d’années. Je suis également l’auteur de [Qwerty-Lafayette][], dont Ergo‑L est +issu, et un contributeur actif d’Ergo‑L depuis deux ou trois ans. + +J’ai fait une conférence sur l’[ergonomie vimiste][] récemment aux +[JdLL][]. Je trouve que pour un usage technique, utiliser Vim +(ou Neovim, Kakoune, Helix, Doom-Emacs…) apporte une ergonomie très supérieure à +ce que n’importe quelle disposition de clavier peut offrir : on écrit peu, et +beaucoup de ce qu’en écrit est auto-complété. + + + +Depuis 6 semaines je fais le test d’écrire en Ergo‑L au quotidien. Comment cela +affecte-t-il ma productivité avec Vim ? Quelles sont les adaptations à faire +pour Ergo‑L ? Y a-t-il une vie après HJKL ? + +TL;DR : Vim fonctionne parfaitement en Ergo‑L, il suffit de ne +**PAS** remapper HJKL. + + + +Pourquoi HJKL ? +-------------------------------------------------------------------------------- + +### Historique + +L’emplacement des touches hjkl est +un hasard : comme Ctrl-h et Ctrl-j +font Backspace et Line Feed (standard ASCII), donc gauche et bas, +l’[ADM-3A](https://en.wikipedia.org/wiki/ADM-3A#Legacy) sur lequel a été codé Vi +a trouvé élégant de compléter avec Ctrl-k et +Ctrl-l pour haut et droite. + +![clavier de l’ADM-3A (1976)](adm3a.jpg) + +Ces touches étant très proches de la position de repos en Qwerty, surtout +jk qui tombent sous les deux doigts forts de la main +droite, l’usage est resté. Et clairement, la possibilité de toujours rester en +position dactylo fait partie des gros gains de confort que l’on découvre avec +Vim. + +### Ne *PAS* remapper HJKL ! + +À une époque fort fort lointaine, ou j’aimais déjà Vim mais contribuais au +projet Bépo, j’avais donc proposé de remapper les touches +ctsr pour retrouver ce confort. [Ce +mapping](https://bepo.fr/wiki/Fichier:Vim-bepo-066.png) est toujours très +utilisé par les Bépoètes aujourd’hui. + +Et c’était une erreur de débutant : + +- ça a singulièrement limité mon apprentissage de Vim, car chaque enchainement + de commandes devait être « traduit » dans ce nouveau référentiel ; +- et surtout, ça m’a maintenu dans des déplacements « case à case », alors que + Vim sait faire **beaucoup** mieux que ça. + +La [suite](#la-vie-après-hjkl) de co billet détaille comment misux se déplacer +dans Vim. + +### Mieux que HJKL : une couche de navigation + +Se limiter aux flèches ou à HJKL est très sous-optimal dans Vim, mais on peut +souhaiter avoir ce confort d’un pavé de flèches sous la position de repos — et +ce, dans toutes les apprications, pas seulement dans Vim. + +Pour cela on définit un layer, que l’on implémente via QMK ou +ZMK si on utilise un clavier programmable, ou avec [kanata][] si on est sur un +clavier de laptop. + +C’est ce que l’on propose avec [Arsenik][], qui donne une couche [NavNum][] avec +un appui long sur la barre d’espace : + +![pavé de flèches à gauche, pavé numérique à droite](/claviers/compacts/navnum.svg) + +Personnellement j’ai opté pour un layer de navigation plus vimiste, avec les +flèches en hjkl et Esc +en accès direct sous un pouce : + +![contrôles à gauche, pavé de navigation à droite](navigation.svg) + +Plutôt que de configurer N applications pour remapper HJKL avec un résultat +souvent imparfait, on utilise donc un layer dédié. Même sans clavier +programmable, une seule configuration kanata est plus simple à maintenir que N +configurations d’applications. + + +La vie après HJKL +-------------------------------------------------------------------------------- + +> Après une semaine de test y’a pas photo : ne pas utiliser [h]{.kbd} et +> [l]{.kbd} c'est le pied ! + +> Le fait de ne pas remapper les touches par défaut en Ergo‑L est **LE** +> game changer : ça facilite énormément l’apprentissage sans +> avoir à se dire « ah mais ce truc, ça se fait comment avec mes mappings ? ». + +> J’ai plus progressé en Vim en quelques jours grâce à ça qu’en quelques années +> avec mes mappings Bépo hasardeux. + +:::{style="text-align: right;"} +— [Vincent Jousse](vjousse), auteur de « [Vim pour les humains][vimebook] » +::: + +### Déplacements verticaux + +Avouons-le de suite : se passer de jk n’est pas immédiat. +C’est la raison pour laquelle Ergo‑L, comme toutes les dispositions qui +utilisent la couche de symboles Lafayette, a `+` et `-` en AltGr sur ces deux +touches. L’action de `+` et `-` étant très proche de `j` et `k`, c’est +utilisable sans aucun mapping : on a le même confort qu’en Qwerty ou Azerty pour +ces deux actions, il suffit de presser AltGr. + +Mais il ne faut pas se contenter de ces deux touches pour les déplacements +verticaux. Vim propose notamment : + +- `{` et `}` pour sauter à la ligne vide précédente ou suivante ; +- `/` et `?` pour rechercher une expression vers le bas ou le haut ; +- `*` et `#` pour aller à la prochaine ou précédente occurrence du mot sous le + curseur ; +- `gg` et `G` pour sauter en début ou fin de document. + +La couche AltGr a été optimisée pour Vim, et la position de `{` et `}` en est +une conséquence. + +### Déplacements horizontaux (simples) + +La première étape consiste à naviguer mot à mot plutôt que case à case : plus +rapide, plus précis. On a ainsi : + +- `w` et `b` pour aller au mot suivant (`w`ord) ou précédent (`b`ackwards) ; +- `e` et `ge` pour aller à la fin (`e`nd) du mot suivant ou précédent ; +- `^` et `$` pour aller en début ou fin de ligne (ces caractères sont en + AltGr + main gauche). + +Et on ne cherchera pas à corriger un mot lettre à lettre. Au contraire, on +réécrira systématiquement le mot en entier : + +- soit c’est du texte, et c’est souvent plus rapide que de viser la bonne lettre + puis de corriger (et on en profite pour apprendre à le taper proprement au + passage — ça fait progresser très vite en dactilographie) ; +- soit c’est du code, et c’est **toujours** plus rapide de le retaper du début + en profitant de l’auto-complétion. + +On utilisera donc : + +- `cw` quand on est en début de mot (`c`hange `w`ord) ; +- `cb` quand on est en fin de mot (`c`hange `b`ackwards) ; +- ou `ciw` quelle que soit la position dans le mot (`c`hange `i`n `w`ord). + +Ce dernier `ciw` est ce qu’on appelle un text object. Les +maitriser permet de s’économiser encore des actions dans Vim. + +### Déplacements horizontaux (avancés) + +Les commandes `f` `F` `t` `T` fournissent une façon plus rapide de se déplacer +horizontalement : + +- `f`x (`f`ind x) déplace le curseur sur la prochaine lettre x ; +- `t`x (`t`ill x) déplace le curseur sur la position précédent la prochaine + lettre x ; +- `F` et `T` (majuscules) font la même chose, mais dans l’autre sens (= vers le + début de ligne) ; +- `;` et `,` vont à la prochaine ou précédente occurrence. + +J’utilise ces mouvements pour aller plus vite à un mot donné qu’avec une +succession de `w` ou `b`. C’est particulièrement efficace quand on vise un +caractère spécial (cas fréquent pour du code), mais ça reste rapide en ciblant +une lettre… ou même tout simplement l’espace. + +On peut aussi utiliser ces mouvements pour cibler une lettre spécifique à +corriger dans un mot. Je préfère corriger par mots entiers avec `ciw` (V. plus +haut) mais ça peut être pratique. Par exemple, pour corriger la phrase suivante +alors que le curseur est en fin de ligne : + +> J’aime taper dans Vmi sans faire de fautes. + +… il suffit de faire `TVxp`. + +De base, ces déplacements sont limités à la ligne courante. Des greffons comme +[EasyMotion][] (Vim) ou [Flash][] (Neovim) étendent ce comportement au document +entier tout en proposant des améliorations ergonomiques, et on conservant la +logique `f` `F` `t` `T`. On se rapproche alors du comportement de [Vimium][]. + +### ~/.vimrc + +Bien que Vim fonctionne out of the box avec Ergo‑L, j’utilise +six mappings pour me faciliter la tâche : + +- `gj` et `gk` sur `+` et `-` pour avoir exactement le même comportement + (= préserver la colonne courante) ; +- interversion de `,` et `;` pour que l’action sans Shift aille vers + la suite (comme je le fais pour Qwerty-Lafayette) ; +- Ctrli sur Ctrlc pour avoir une + paire pour la navigation dans la pile de sauts ; +- `` sur Espace, que je recommande vivement quelle que soit + la disposition de clavier utilisée. + +```vim +nnoremap + gj +nnoremap - gk +nnoremap , ; +nnoremap ; , +nnoremap +nnoremap +let mapleader=" " +``` + + +Pour aller plus loin +-------------------------------------------------------------------------------- + +### Navigation + +Je considère que les panneaux latéraux avec une arborescence de fichiers sont un +anti-pattern. Vim propose des fonctions de plus haut niveau +bien plus efficaces pour naviguer entre plusieurs fichiers, notamment : + +- les fuzzy finders tels que [fzf][] et [Telescope][] ; +- les serveurs [LSP][], pour se déplacer dans un arbre de code. + +Ce sont deux domaines où Neovim est sensiblement supérieur à Vim. Telescope est +vraiment magique. <3 + +### Vimification du bureau + +On peut profiter de l’ergonomie vimiste sur l’ensemble du bureau. Parmi les +outils dont j’aurais du mal à me passer, il y a : + +- [Vimium][] pour naviguer au clavier dans Firefox ou Chrome ; +- [i3][] ou [Sway][] comme gestionnaires de fenêtres sous Linux ; +- [dmenu][] ou [Rofi][] pour lancer une app via fuzzy-matching ; +- [Ranger][], [lf][], [Yazi][] comme explorateurs de fichiers dans le terminal — + voire dans Vim, avec l’extension [TermOpen][]. + +Avec ces outils, je n’ai plus l’usage de la souris : je fais quasiment tout au +clavier, et l’émulation QMK de mon Ferris suffit pour les rares cas où je dois +déplacer le pointeur. + + +Conclusion +-------------------------------------------------------------------------------- + +Adepte du Qwerty (version Lafayette) depuis plus de 15 ans, je craignais de +perdre en confort sous Vim avec Ergo‑L. À l’usage, le seul inconvénient que je +vois c’est de devoir maintenir AltGr pour les déplacements verticaux +`j`/`k` — mais à l’usage ça s’enchaine très bien avec `{`/`}` et `^`/`$` en main +gauche, donc je n’ai pas l’impression de perdre en confort. + +Adepte du déplacement mot à mot, je pensais ne pas utiliser `h`/`l` du tout mais +le passage à Ergo‑L m’a prouvé le contraire : je les utilisais souvent pour un +seul caractère. Mais F et T étant bien placés en Ergo‑L, +je les utilise désormais beaucoup plus et ça m’évite des successions d’appuis +sur W et B. + +Pour le reste, je n’ai pas ressenti de frictions sous Vim en passant à Ergo‑L. +Il y a même des gains inattendus, comme avoir N en position de repos +et le point sur l’autre main. + +Ergo‑L a été conçu par des Vimistes, et ça se sent ! + + +[Arsenik]: /claviers/arsenik +[NavNum]: /claviers/compacts/#layer-navnum + +[JdLL]: https://jdll.org +[vjousse]: https://mastodon.social/@vjousse@mamot.fr/112886863404314065 +[kanata]: https://github.com/jtroo/kanata +[vimebook]: https://vimebook.com/fr +[tupperVim]: https://tuppervim.org +[EasyMotion]: https://github.com/easymotion/vim-easymotion +[Flash]: https://github.com/folke/flash.nvim + +[Vimium]: https://vimium.github.io/ +[Telescope]: https://github.com/nvim-telescope/telescope.nvim +[fzf]: https://github.com/junegunn/fzf.vim +[LSP]: https://microsoft.github.io/language-server-protocol/ +[i3]: https://i3wm.org/ +[Sway]: https://swaywm.org/ +[dmenu]: https://tools.suckless.org/dmenu/ +[rofi]: https://github.com/davatorium/rofi +[ranger]: https://github.com/ranger/ranger +[lf]: https://github.com/gokcehan/lf +[yazi]: https://github.com/sxyazi/yazi +[TermOpen]: https://github.com/fabi1cazenave/termopen.vim + +[Qwerty-Lafayette]: https://qwerty-lafayette.org +[ergonomie vimiste]: https://fabi1cazenave.github.io/slides/2024-jdll-vim-ergo/ diff --git a/www/content/articles/vim_pour_les_ergonautes/lafayette.jpg b/www/content/articles/vim_pour_les_ergonautes/lafayette.jpg new file mode 100644 index 00000000..3f795af8 Binary files /dev/null and b/www/content/articles/vim_pour_les_ergonautes/lafayette.jpg differ diff --git a/www/content/articles/vim_pour_les_ergonautes/navigation.svg b/www/content/articles/vim_pour_les_ergonautes/navigation.svg new file mode 100644 index 00000000..1d938869 --- /dev/null +++ b/www/content/articles/vim_pour_les_ergonautes/navigation.svg @@ -0,0 +1,225 @@ + + + + + + + + + Q + + + + W + ^w + + + + E + + + + + R + + + + + T + + + + + + Y + + + + + U + + + + + I + + + + + O + + + + + P + + + + + + + + + A + ^a + + + + S + ^s + + + + D + + + + + F + + + + + G + + + + + + H + + + + + J + + + + + K + + + + + L + + + + + ; + : + + + + + + + + + Z + ^z + + + + X + ^x + + + + C + ^c + + + + V + ^v + + + + B + + + + + + N + 🖰 + + + + + M + 🖰 + + + + + , + < + 🖰 + + + + + . + > + 🖰 + + + + + / + ? + + + + + + + + + + + + + navigation + + + + + + + + +