Les Hydres vont enchanter votre expérience avec Emacs
Emacs est un éditeur de texte formidable mais, c'est sûr, il est un peu bizarre sur les bords et devenir à l'aise avec demande… de passer sa vie dedans.
Le nouveau venu n'est pas totalement laissé seul car les menus nous
indiquent déjà bon nombre de commandes et raccourcis claviers et les
nombreuses commandes d'aide (C-h ?
) tirent parti du fait qu'Emacs,
développé avec son propre langage de programmation de la famille des
Lisp, un peu vieux aussi mais très cool, est auto-documenté.
Il y avait quand même la place pour des améliorations plus
sympathiques, et justement ça bouge bien de ce côté là en ce
moment. Tous les emacsiens doivent connaître magit, l'interface à git
ultra-pratique qui introduisait une interface fort intuitive car
auto-découvrable, dans laquelle il ne suffit que de taper une ou deux
touches pour effectuer des actions. Pour la capture suivante, j'ai
lancé magit avec magit-status
, j'ai appuyé sur TAB pour voir ce que
j'ai modifié dans myemacs.org
, et j'ai appuyé sur c
pour voir le
menu des commits.
En apparté, mon dernier émerveillement a été quand j'ai vu qu'on
pouvait -enfin- rebaser interactivement depuis magit. Il suffit
d'afficher l'historique (l
comme logs), de se placer sur un commit
et d'appuyer sur E
(c'est une des commandes qui ne sont pas dans le
menu). On se retrouve avec la liste des commits à squasher, renommer
ou "picker", ce qu'on fait avec une touche, et un habituel C-c-c
pour confirmer.
Donc l'interface de magit est superbe, mais elle est encore interne à
magit :/ Nous avons bien eu le méga bloggueur Mickeyp qui a ré-écrit
ce système, en attendant la version des développeurs de magit. Nous
avons donc discover.el (dans MELPA: à installer avec M-x
package-install RET discover RET
), qui permet d'écrire très
facilement ce genre de petit menu pour nos propres actions.
Un exemple pour montrer que c'est facile:
(require 'virtualenvwrapper) (require 'discover) (discover-add-context-menu :context-menu '(virtualenvwrapper (description "python's virtual environment manager") (actions ("virtualenvwrapper" ("w" "workon" venv-workon) ("d" "deactivate" venv-deactivate) ("m" "make virtual env" venv-mkvirtualenv) ("s" "shell command to all" venv-allvirtualenv-shell-command) ("c" "cd" venv-cdvirtualenv) ("y" "copy" venv-cpvirtualenv) ("r" "remove" venv-rmvirtualenv) )) ) :bind "s-d v" ) (defalias 'discover-venv 'makey-key-mode-popup-virtualenvwrapper)
Maintenant, quand vous appelez M-x discover-venv
(ou par super-d
v
, comme "discover venv"), vous avez un petit menu qui vous présente
des choix. C'est pratique pour découvrir un paquet, quand on ne
l'utilise pas souvent.
En installant discover
, vous aurez par défaut un gros menu pour
Dired (l'explorateur de fichiers) quand vous l'appellerez avec ?
.
Tout ceci est super, mais nous avons un autre bloggueur exceptionnel (abo-abo) qui a peut être fait mieux. Il a créé des monstres à plusieurs têtes, il a créé les Hydra.
Les Hydres servent à la même chose que discover.el, mais vont un peu plus loin. Les Hydres ne meurent pas facilement, seul Hercules sait les vaincre. Cela veut dire qu'une Hydre présente plusieurs têtes (commandes), qu'on peut appeler plusieurs fois ces commandes et que l'Hydre reste en place. On la tue avec une touche qui ne soit pas une tête (commande) et, de plus, cette touche ne sert pas qu'à tuer l'Hydre, elle remplit aussi son rôle habituel.
Il y a plusieurs variations que vous lirez par les mots de l'auteur si vous le souhaitez. Des exemples tout de suite:
(defhydra hydra-zoom (global-map "<f2>") "zoom" ("g" text-scale-increase "in") ("l" text-scale-decrease "out"))
Un appui sur F2
appelle l'Hydre. On augmente ou réduit la taille du
texte avec g
et l
, ou bien 5 fois avec 5g
. On arrête le zoom
avec n'importe quelle autre touche.
Une capture d'écran d'une Hydre qui nous liste les actions possibles
quand on est dans ibuffer
, le gestionnaire de buffers interactif
(C-x C-b
). Il présente aussi des menus.
Ne manquez pas d'aller voir le wiki pour de nouvelles Hydres. J'aime
notamment celle qui permet d'insérer facilement des blocs de code dans
org-mode. Normalement c'est <
+ un caractère + TAB (q
pour
"quote"), maintenant dès qu'on tape <
à un début de ligne, une hydre
nous présente un joli choix:
;; In org-mode: type < and have a menu to choose the expansion. ;; http://oremacs.com/2015/03/07/hydra-org-templates/ (defhydra hydra-org-template (:color blue :hint nil) " _c_enter _q_uote _e_macs-lisp _L_aTeX: _l_atex _E_xample _p_erl _i_ndex: _a_scii _v_erse _P_erl tangled _I_NCLUDE: _s_rc ^ ^ plant_u_ml _H_TML: _h_tml ^ ^ ^ ^ _A_SCII: " ("s" (hot-expand "<s")) ("E" (hot-expand "<e")) ("q" (hot-expand "<q")) ("v" (hot-expand "<v")) ("c" (hot-expand "<c")) ("l" (hot-expand "<l")) ("h" (hot-expand "<h")) ("a" (hot-expand "<a")) ("L" (hot-expand "<L")) ("i" (hot-expand "<i")) ("e" (progn (hot-expand "<s") (insert "emacs-lisp") (forward-line))) ("p" (progn (hot-expand "<s") (insert "perl") (forward-line))) ("u" (progn (hot-expand "<s") (insert "plantuml :file CHANGE.png") (forward-line))) ("P" (progn (insert "#+HEADERS: :results output :exports both :shebang \\"#!/usr/bin/env perl\\"\\n") (hot-expand "<s") (insert "perl") (forward-line))) ("I" (hot-expand "<I")) ("H" (hot-expand "<H")) ("A" (hot-expand "<A")) ("<" self-insert-command "ins") ("o" nil "quit")) (defun hot-expand (str) "Expand org template." (insert str) (org-try-structure-completion)) ;; I bind it for myself like this: (define-key org-mode-map "<" (lambda () (interactive) (if (looking-back "^") (hydra-org-template/body) (self-insert-command 1))))
On va s'arrêter là. Amusez-vous bien et longue vie à Emacs !
ps: pour essayer un bout de code:
- installez Hydra:
Alt-x package-refresh-content ;; au cas-où Alt-x package-install RET hydra RET Alt-x list-packages ;; pour satisfaire votre curiosité.
- copiez-collez le n'importe où et tapez
C-x-e
à la fin d'un bloc de parenthèses (un seul bloc à la fois) ou bien dans un buffer, tout seul, et appelezM-x eval-current-buffer
.
pps: pour débuter gentiment avec Emacs, commencez avec une bonne configuration, essayez Emacs Prelude.
*