From bae184f5fc4b824b7557551b0e1bc6a81c014a25 Mon Sep 17 00:00:00 2001 From: David Edmondson Date: Thu, 22 Apr 2010 10:03:43 +0100 Subject: [PATCH] emacs: Add notmuch-address.el for address completion using notmuch A tool `notmuch-addresses' is required to produce addresses which match a query string. An example of a suitable script can be found in the git repository at http://jkr.acm.jhu.edu/git/notmuch_addresses.git There are no doubt others. --- emacs/Makefile.local | 3 +- emacs/notmuch-address.el | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 emacs/notmuch-address.el diff --git a/emacs/Makefile.local b/emacs/Makefile.local index e5013b36..7537c3d5 100644 --- a/emacs/Makefile.local +++ b/emacs/Makefile.local @@ -8,7 +8,8 @@ emacs_sources := \ $(dir)/notmuch-show.el \ $(dir)/notmuch-wash.el \ $(dir)/notmuch-hello.el \ - $(dir)/notmuch-mua.el + $(dir)/notmuch-mua.el \ + $(dir)/notmuch-address.el emacs_images := \ $(dir)/notmuch-logo.png diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el new file mode 100644 index 00000000..69a52a29 --- /dev/null +++ b/emacs/notmuch-address.el @@ -0,0 +1,91 @@ +;; notmuch-address.el --- address completion with notmuch +;; +;; Copyright © David Edmondson +;; +;; This file is part of Notmuch. +;; +;; Notmuch is free software: you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Notmuch is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Notmuch. If not, see . +;; +;; Authors: David Edmondson + +(require 'message) + +;; + +(defcustom notmuch-address-command "notmuch-addresses" + "The command which generates possible addresses. It must take a +single argument and output a list of possible matches, one per +line." + :type 'string + :group 'notmuch) + +(defvar notmuch-address-message-alist-member + '("^\\(Resent-\\)?\\(To\\|B?Cc\\|Reply-To\\|From\\|Mail-Followup-To\\|Mail-Copies-To\\):" + . notmuch-address-expand-name)) + +(defvar notmuch-address-history nil) + +(defun notmuch-address-message-insinuate () + (if (not (memq notmuch-address-message-alist-member message-completion-alist)) + (setq message-completion-alist + (push notmuch-address-message-alist-member message-completion-alist)))) + +(defun notmuch-address-options (original) + (process-lines notmuch-address-command original)) + +(defun notmuch-address-expand-name () + (let* ((end (point)) + (beg (save-excursion + (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*") + (goto-char (match-end 0)) + (point))) + (orig (buffer-substring-no-properties beg end)) + (completion-ignore-case t) + (options (notmuch-address-options orig)) + (chosen (if (eq (length options) 1) + (car options) + (completing-read "Address: " (cdr options) nil nil (car options) + 'notmuch-address-history)))) + (when chosen + (push chosen notmuch-address-history) + (delete-region beg end) + (insert chosen)))) + +;; Copied from `w3m-which-command'. +(defun notmuch-address-locate-command (command) + "Return non-nil if `command' is an executable either on +`exec-path' or an absolute pathname." + (when (stringp command) + (if (and (file-name-absolute-p command) + (file-executable-p command)) + command + (setq command (file-name-nondirectory command)) + (catch 'found-command + (let (bin) + (dolist (dir exec-path) + (setq bin (expand-file-name command dir)) + (when (or (and (file-executable-p bin) + (not (file-directory-p bin))) + (and (file-executable-p (setq bin (concat bin ".exe"))) + (not (file-directory-p bin)))) + (throw 'found-command bin)))))))) + +;; If we can find the program specified by `notmuch-address-command', +;; insinuate ourselves into `message-mode'. +(when (notmuch-address-locate-command notmuch-address-command) + (notmuch-address-message-insinuate)) + +;; + +(provide 'notmuch-address) -- 2.26.2