Skip to content
Quickly pick items from ad hoc menus in Emacs
Branch: master
Clone or download
Latest commit 4c1393f Apr 3, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
images
.gitignore
README.org Rephrase description Mar 15, 2019
frog-menu.el Version bump Apr 3, 2019

README.org

Description

This package lets you quickly pick strings from ad hoc menus. Just like a frog would catch a fly. The menu is built “on the fly” from a collection of strings. It’s presented to the user to choose one of them by pressing a single key. One example where this kind of menu is useful are spelling correction suggestions:

./images/spellcheck.png

The user can specify a prompt and additional action keys as you can see in the bottom of the menu. Usage in the terminal is also supported:

./images/spellcheck2.png

Inspired by ace-popup-menu.

Example

To invoke the menu users can call frog-menu-read. How items are displayed and choosen depends on frog-menu-type. For graphical displays the type avy-posframe uses avy and posframe. In terminals the type avy-side-window is used. The implemented handler functions can be used as reference if you want to define your own frog-menu-type.

Here is an example how you would invoke a frog menu:

(frog-menu-read "Choose a string"
                '("a" "list" "of strings"))

It is also possible to define additional action keys (as shown in the screenshot). Here is an example how you could use frog-menu-read to implement a flyspell-correct-interface:

(require 'flyspell-correct)

(defun frog-menu-flyspell-correct (candidates word)
  "Run `frog-menu-read' for the given CANDIDATES.

List of CANDIDATES is given by flyspell for the WORD.

Return selected word to use as a replacement or a tuple
of (command . word) to be used by `flyspell-do-correct'."
  (let* ((corrects (if flyspell-sort-corrections
                       (sort candidates 'string<)
                     candidates))
         (actions `(("C-s" "Save word"         (save    . ,word))
                    ("C-a" "Accept (session)"  (session . ,word))
                    ("C-b" "Accept (buffer)"   (buffer  . ,word))
                    ("C-c" "Skip"              (skip    . ,word))))
         (prompt   (format "Dictionary: [%s]"  (or ispell-local-dictionary
                                                   ispell-dictionary
                                                   "default")))
         (res      (frog-menu-read prompt corrects actions)))
    (unless res
      (error "Quit"))
    res))

(setq flyspell-correct-interface #'frog-menu-flyspell-correct)

Afterwards calling M-x flyspell-correct-wrapper will prompt you with a frog-menu.

You can’t perform that action at this time.