Artisan Numérique

/système/clavier/urxvt/vim/x11/xmodmap/ Faire quelque chose d'utile avec CapsLock

N'aillons pas peu de le dire, la touche CapsLock est à l'informaticien ce que la tringle est à l'homme des penderies, une plaie. Vestige des antiques machines à écrire, elle ne sert à rien si ce n'est à se bloquer lorsqu'il ne le faudrait pas. Alors nous allons voir ici comment prendre 10 minutes pour en faire quelque chose d'enfin utile, à savoir afficher la liste des buffers sous VIM.

Désactivation de CapsLock

Comme vous le savez peut-être déjà, xmodmap est le lointain ancêtre de XKB. Lointain mais toujours aussi utile lorsqu'il s'agit de redéfinir le clavier sous Xorg. Ici nous allons l'utiliser pour retirer à cette touche son rôle de verrouillage des majuscules.

Pour faire cela, nous allons devoir créer (ou étendre) un fichier ~/.Xmodmap

clear Lock
reconfiguration de la touche capslock

Pour tester, nous allons sourcer ce fichier par la commande xmodmap ~/.Xmodmap, vous constaterez dés lors que la touche ne fonctionne plus. Parfait :-)

Pour rendre ce comportement définitive nous ne devrions rien avoir à faire de plus que redémarrer X11. Sauf que sous certains gestionnaires de fenêtres cela ne suffit pas. Il faut donc rajouter dans son ~/.xinitrc quelque chose comme cela

(sleep 5 ; xmodmap ~/.Xmodmap) &

Ainsi on laisse le temps au gestionnaire de fenêtre de d'initialiser, puis on applique notre hack.

Paramétrage d'URxvt

Pour l'instant cette nouvelle touche n'est connue de personne. Si vous la pressez dans une console URxvt, il ne se passera strictement rien. Nous allons donc lui inventer une existence en lui affectant une séquence d'échappement bidon. Mais pour cela il nous faut connaître son petit nom X11. Vu que l'on a peu de chance de se tromper en imaginant qu'elle s'appelle Caps-quelquechose, voyons ce qu'en pense xmodmap :

$ xmodmap -pk | grep -i caps
66      0xffe5 (Caps_Lock)  0x0000 (NoSymbol)  0xffe5 (Caps_Lock)
recherche du nom X11 de CapsLock

Notre touche s'appelle donc Caps_Lock, nous allons maintenant indiquer cela à URxvt en modifiant le fichier ~/.Xdefaults:

URxvt.keysym.Caps_Lock: \033[UlCapslock
déclaration de CapsLock

Si vous lancez maintenant une nouvelle console et que vous tapez un cat -v, en pressant la touche CapsLock vous devrez voir apparaître ^[[UlCapslock. Notre nouvelle séquence bidon est fonctionnelle.

Récupération de la séquence dans VIM

Dans cette console, nous allons maintenant lancer VIM. Ce dernier ne connaît évidemment pas notre cette séquence bidon. Il va donc falloir lui expliquer cela gentiment. Pour cela il y a deux approches.

La première consiste simplement à créer un mapping de type map ^[[UlCapslock Mon_Action. Alors ça fonctionne, mais ce n'est pas terrible. En effet, pour VIM, ce mapping correspond à une séquence de touche. En d'autres termes, c'est un peu comme si vous aviez tapé cela en moins d'une seconde. Ceci a pour inconvénient que VIM à chaque fois que vous presserez Esc attendra une seconde pour être certain que rien ne va arriver derrière...

L'autre option consiste à redéfinir la séquence associée à la touche elle-même puis mapper classiquement cette touche à une commande. S'il s'agissait de simuler la touche Home, nous aurions ainsi pu utiliser la commande :set <Home>=^[[UlCapsLock.

Nous pouvons ainsi redéfinir toutes les touches connues de VIM ce qui serait la solution si VIM connaissait la touche Caps_Lock, ce qui n'est pas le cas.

Pour contourner ce problème, nous allons donc redéfinir une touche connue de VIM mais pas de notre clavier. Et il y en a un paquet. Par exemple VIM connaît les touche F13 à F37, et même S-F13 à S-F37. Cela nous donne déjà un vaste terrain de jeu.

Nous allons donc assigner notre séquence bidon à la touche F13 puis mapper F13 sur la commande FuzBuffer. Pour ceux qui ne le savent pas FuzBuffer est commande fournie par le très bon plugin FuzzyFinder affichant la listes des buffers ouverts pour basculer rapidement de l'un à l'autre. Une excellente alternatives aux onglets bordéliques.

Cela nous donne dans notre fichier ~/.vimrc

set <F13>=^[[UlCapsLock
map <F13> :FufBuffer<CR>
map! <F13> <Esc>:FufBuffer<CR>
initialisation de la séquence bidon à F13

Notez que le ^[ est un caractère littéral de code 27 (ou \033 en octal). Pour l'obtenir dans VIM, passez en insertion, tapez Ctrl-V puis pressez CapsLock. Toute la séquence devrait être ainsi automatiquement saisie.

Ceci fait, un petit coup de :source ~/.vimrc et vous pouvez profiter de votre nouvelle de votre nouvelle touche CapsLock, enfin utile.

Conclusion

Alors il s'agit bien évidement là d'un exemple et le cheminement décrit ici peut être utilisé totalement ou en partie pour faire plein d'autres choses comme faire passer URxvt pour un XTerm (pratique pour les serveurs distant qui ne connaissent pas urxvt) ou encore ajouter des touches que VIM ne reconnait pas (ex. Ctrl-Espace).