I'd like to also emphasize that the whole menu string is displayed with the `lv-message' function, which mirrors `message', except it uses an equivalent of the Echo Area above the actual Echo Area. This removes the drawback of the 2-second delay whenever new messages need to be displayed in the minibuffer, and also it doesn't get overwritten by other messages. Hydra has a pretty easy interface, similar to `easy-menu-define', to define this menu (here ^ are just alignment chars): (defhydra hydra-ivy (:hint nil :color pink) " ^^^^^^ ^Yes^ ^No^ ^Maybe^ ^^^^^^^^^^^^^^--------------------------------------- ^ ^ _k_ ^ ^ _f_ollow _i_nsert _c_: calling %s(if ivy-calling \"on\" \"off\") _h_ ^+^ _l_ _d_one _o_ops _m_: matcher %s(if (eq ivy--regex-function 'ivy--regex-fuzzy) \"fuzzy\" \"ivy\") ^ ^ _j_ ^ ^ ^ ^ ^ ^ _<_/_>_: shrink/grow window " ;; arrows ("h" ivy-beginning-of-buffer) ("j" ivy-next-line) ("k" ivy-previous-line) ("l" ivy-end-of-buffer) ;; actions ("o" keyboard-escape-quit :exit t) ("C-g" keyboard-escape-quit :exit t) ("i" nil) ("C-o" nil) ("f" ivy-alt-done :exit nil) ("C-j" ivy-alt-done :exit nil) ("d" ivy-done :exit t) ("C-m" ivy-done :exit t) ("c" ivy-toggle-calling) ("m" ivy-toggle-fuzzy) (">" ivy-minibuffer-grow) ("<" ivy-minibuffer-shrink))