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.
 
  