]> git.notmuchmail.org Git - notmuch/blob - emacs/notmuch-address.el
emacs: Don't prompt the user to choose from zero matching addresses.
[notmuch] / emacs / notmuch-address.el
1 ;; notmuch-address.el --- address completion with notmuch
2 ;;
3 ;; Copyright © David Edmondson
4 ;;
5 ;; This file is part of Notmuch.
6 ;;
7 ;; Notmuch is free software: you can redistribute it and/or modify it
8 ;; under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation, either version 3 of the License, or
10 ;; (at your option) any later version.
11 ;;
12 ;; Notmuch is distributed in the hope that it will be useful, but
13 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;; General Public License for more details.
16 ;;
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with Notmuch.  If not, see <http://www.gnu.org/licenses/>.
19 ;;
20 ;; Authors: David Edmondson <dme@dme.org>
21
22 (require 'message)
23
24 ;;
25
26 (defcustom notmuch-address-command "notmuch-addresses"
27   "The command which generates possible addresses. It must take a
28 single argument and output a list of possible matches, one per
29 line."
30   :type 'string
31   :group 'notmuch)
32
33 (defvar notmuch-address-message-alist-member
34   '("^\\(Resent-\\)?\\(To\\|B?Cc\\|Reply-To\\|From\\|Mail-Followup-To\\|Mail-Copies-To\\):"
35               . notmuch-address-expand-name))
36
37 (defvar notmuch-address-history nil)
38
39 (defun notmuch-address-message-insinuate ()
40   (if (not (memq notmuch-address-message-alist-member message-completion-alist))
41       (setq message-completion-alist
42             (push notmuch-address-message-alist-member message-completion-alist))))
43
44 (defun notmuch-address-options (original)
45   (process-lines notmuch-address-command original))
46
47 (defun notmuch-address-expand-name ()
48   (let* ((end (point))
49          (beg (save-excursion
50                 (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*")
51                 (goto-char (match-end 0))
52                 (point)))
53          (orig (buffer-substring-no-properties beg end))
54          (completion-ignore-case t)
55          (options (notmuch-address-options orig))
56          (num-options (length options))
57          (chosen (cond
58                   ((eq num-options 0)
59                    nil)
60                   ((eq num-options 1)
61                    (car options))
62                   (t
63                    (completing-read (format "Address (%s matches): " num-options)
64                                     (cdr options) nil nil (car options)
65                                     'notmuch-address-history)))))
66     (if chosen
67         (progn
68           (push chosen notmuch-address-history)
69           (delete-region beg end)
70           (insert chosen))
71       (message "No matches.")
72       (ding))))
73
74 ;; Copied from `w3m-which-command'.
75 (defun notmuch-address-locate-command (command)
76   "Return non-nil if `command' is an executable either on
77 `exec-path' or an absolute pathname."
78   (when (stringp command)
79     (if (and (file-name-absolute-p command)
80              (file-executable-p command))
81         command
82       (setq command (file-name-nondirectory command))
83       (catch 'found-command
84         (let (bin)
85           (dolist (dir exec-path)
86             (setq bin (expand-file-name command dir))
87             (when (or (and (file-executable-p bin)
88                            (not (file-directory-p bin)))
89                       (and (file-executable-p (setq bin (concat bin ".exe")))
90                            (not (file-directory-p bin))))
91               (throw 'found-command bin))))))))
92
93 ;; If we can find the program specified by `notmuch-address-command',
94 ;; insinuate ourselves into `message-mode'.
95 (when (notmuch-address-locate-command notmuch-address-command)
96   (notmuch-address-message-insinuate))
97
98 ;;
99
100 (provide 'notmuch-address)