Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 7858E4196F3 for ; Thu, 22 Apr 2010 02:03:52 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -1.9 X-Spam-Level: X-Spam-Status: No, score=-1.9 tagged_above=-999 required=5 tests=[BAYES_00=-1.9] autolearn=ham Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uaFygYGFVtdA for ; Thu, 22 Apr 2010 02:03:51 -0700 (PDT) Received: from mail-ww0-f53.google.com (mail-ww0-f53.google.com [74.125.82.53]) by olra.theworths.org (Postfix) with ESMTP id 56A424196F2 for ; Thu, 22 Apr 2010 02:03:51 -0700 (PDT) Received: by wwb28 with SMTP id 28so2069847wwb.26 for ; Thu, 22 Apr 2010 02:03:50 -0700 (PDT) Received: by 10.216.89.213 with SMTP id c63mr600716wef.8.1271927029702; Thu, 22 Apr 2010 02:03:49 -0700 (PDT) Received: from ut.hh.sledj.net (host83-217-165-81.dsl.vispa.com [83.217.165.81]) by mx.google.com with ESMTPS id x14sm16335152wbs.18.2010.04.22.02.03.47 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 22 Apr 2010 02:03:48 -0700 (PDT) Received: by ut.hh.sledj.net (Postfix, from userid 1000) id 59E26594163; Thu, 22 Apr 2010 10:03:45 +0100 (BST) From: David Edmondson To: notmuch@notmuchmail.org Subject: [PATCH] emacs: Add notmuch-address.el for address completion using notmuch Date: Thu, 22 Apr 2010 10:03:43 +0100 Message-Id: <1271927023-10103-1-git-send-email-dme@dme.org> X-Mailer: git-send-email 1.7.0 X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Apr 2010 09:03:52 -0000 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 deletions(-) create mode 100644 emacs/notmuch-address.el diff --git a/emacs/Makefile.local b/emacs/Makefile.local index e5013b3..7537c3d 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 0000000..69a52a2 --- /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) -- 1.7.0