summaryrefslogtreecommitdiffstats
path: root/posts/Ask_for_selection_in_emacs.mdwn
blob: 6956c2c609f861fd4e662bc034abc0245ba01eac (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
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:

[[!format el """
(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")))))
"""]]

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`.

[[!meta date="2012-05-02 21:09:00"]]
[[!tag emacs elisp coding]]