2023-01-27      Poor man's hydra

 For the  longest time  I used  the excellent  Hydra-package[1]. With
 Hydra it  is possible  the reintroduce  modal editing  into modeless
 Emacs. Once activated you  can use a single key press  or a chain of
 single key presses to call whatever Emacs function. Here is the most
 simple example from the GitHub page:

   (defhydra hydra-zoom (global-map "<f2>")
     "zoom"
     ("g" text-scale-increase "in")
     ("l" text-scale-decrease "out"))

 Once the F2-key is pressed you can repeatedly adjust the font scale by
 pressing  "g"  or "l"  (not  the  we would  need  that  since we  have
 text-scale-adjust).

 Now,  I don't  like modal  editing  but I  also don't  want to  assign
 different keybindings for all my often  used commands. So I used hydra
 to  create a  simple modal  menu. This  way I  only need  to bind  one
 keybinding to the hydra-menu and not a bazillion of the them for every
 single function I want  to call. Here is an example  of this menu with
 hydra:

   (defhydra sulaco/hydra-menu (:columns 1)
     "Select"
     ("e" gnus "Gnus (Email)" :exit t)
     ("g" elpher "Elpher (Gopher)" :exit t)
     ("r" elfeed "Elfeed (RSS)" :exit t)
     ("s" (switch-to-buffer "*scratch*") "Scratchpad" :exit t)
     ("x" (shell-command "xset dpms force off")
          "Monitor off" :exit t))

   (define-key global-map (kbd "<f1>") 'sulaco/hydra-menu/body)

 That's all  fine and dandy  but some time  later I stumbled  upon some
 elisp snippet which would achieve nearly the same without the need for
 the Hydra-package. Applied to my custom menu it looks like this:

   (defun sulaco/hydra-menu ()
     (interactive)
     (let ((keymap (make-sparse-keymap)))
       (define-key keymap (kbd "e") 'gnus)
       (define-key keymap (kbd "g") 'elpher)
       (define-key keymap (kbd "r") 'elfeed)
       (define-key keymap (kbd "s") (lambda () (interactive)
                   (switch-to-buffer "*scratch*")))
       (define-key keymap (kbd "x") (lambda () (interactive)
                   (shell-command "xset dpms force off")))
       (message "[modal menu]")
       (set-temporary-overlay-map keymap)))

   (define-key global-map (kbd "<f1>") 'sulaco/hydra-menu)

 It's not exactly the  same. For once it lacks all  of the options that
 hydra offers  and it definitely  does not look  as nice but  it's just
 good enough  for me. So  now I finally can

 M-x package-delete RET hydra RET.

 Another 17 femtoseconds shaved off of my Emacs startup time!!!1 :^)


Footnotes
_________

[1] https://github.com/abo-abo/hydra