summaryrefslogtreecommitdiffstats
path: root/site/blog/Ask_for_selection_in_emacs.org
blob: e2bff3523ebf9d693d4ab50cfc935cb5382c5d88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#+TITLE: Ask for selection in Emacs
#+DATE: 2012-05-02 21:09:00
#+TAGS: emacs elisp coding

I came across an email on one of the emacs mailing lists today, where
someone asked how to ask a user for input whilst providing
completions.  The first answer he got was to try =tmm-prompt=, so I
looked into it a little.

I use =mu4e= as my primary email program, but since it isn't designed
(seemingly) for use with multiple accounts I've got some wrapper
functions that set some variables according to my liking and then
start =mu4e=. This works very well, but it's a pain to have to use =M-x
view-ryu-mail= or =M-x view-ninthfloor-mail= and such, so I wrote a
function to read a string from the minibuffer, which I then bound to
the ~<XF86Mail>~ key, this turned it into, for example =<XF86Mail> ryu=
and =<XF86Mail> ninthfloor= and so on, but this doesn't have any
completion or notification of my options.

So after looking at ~tmm-prompt~ I came up with the following:

#+BEGIN_SRC elisp
  (defvar oni:mailbox-map
    '(("ryulash.org" . "ryu")
      ("ninthfloor" . "ninthfloor"))
    "A mailbox map for use with `tmm-prompt'.")

  (defun view-ryu-mail ()...)
  (defun view-ninthfloor-mail ()...)

  (defun view-mu ()
    (interactive)
    (let* ((tmm-completion-prompt "Choose a mailbox\n")
           (inbox (tmm-prompt oni:mailbox-map)))
      (funcall (intern (concat "view-" inbox "-mail")))))
#+END_SRC

I've left out the definitions and some mail accounts for brevity.

~tmm-prompt~ is usually used when using the text-mode menu with =M-` `=,
but it works very well here too. This changes mailbox selection to,
for example =<XF86Mail> r= or =<XF86Mail> n=.