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.

1426105135.png

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:

hydra-org-template.png

;; 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 appelez M-x eval-current-buffer.

pps: pour débuter gentiment avec Emacs, commencez avec une bonne configuration, essayez Emacs Prelude.

*

Vus : 1287
Publié par matutine : 5