--- /dev/null
+Return-Path: <markwalters1009@gmail.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 4A0576DE1413\r
+ for <notmuch@notmuchmail.org>; Sun, 20 Dec 2015 01:07:42 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.182\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.182 tagged_above=-999 required=5 tests=[AWL=0.388,\r
+ DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,\r
+ FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7,\r
+ RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001]\r
+ autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id JBsfF0OTbFrv for <notmuch@notmuchmail.org>;\r
+ Sun, 20 Dec 2015 01:07:40 -0800 (PST)\r
+Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com\r
+ [74.125.82.45]) by arlo.cworth.org (Postfix) with ESMTPS id 2021E6DE025F for\r
+ <notmuch@notmuchmail.org>; Sun, 20 Dec 2015 01:07:40 -0800 (PST)\r
+Received: by mail-wm0-f45.google.com with SMTP id p187so34903007wmp.0\r
+ for <notmuch@notmuchmail.org>; Sun, 20 Dec 2015 01:07:40 -0800 (PST)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\r
+ h=from:to:cc:subject:date:message-id;\r
+ bh=OQGCT/U+8gD2am7zCk22VjLtzaXxa1cjiwIJGaArSgU=;\r
+ b=VFTmysfWkrPGhSGzYf/5qCS2hY4+7okEPvJLb9tR76a6r541gbz1t1bQZCbGGzrkLv\r
+ 3Nqu7CK46VutkURpwtPrDU3zfwD0zY8Xp8CB4vm/kr/+auyzJy8xdq7Mvuj+JWyRThic\r
+ +VOkLSJfsnsO96n/BJGCb+o3F1Gf93S5FbPPdF5c8Oh4dsETWXqHm8guqqN8Qzjo+pEB\r
+ OrOghHPBfQDCgHwU/3iWJU+sRTi+V4wr8wstQCXvzCLWes0ox+b1fiSucNOgRweL7Qph\r
+ qvUHhPaiDXa4gQPGpBWAPVZRVb+GY0Vs7c2I+gVc5z66Agf87ZXhP2gmWnCNEIbipcsa\r
+ YmRQ==\r
+X-Received: by 10.28.125.201 with SMTP id y192mr13586178wmc.23.1450602458320; \r
+ Sun, 20 Dec 2015 01:07:38 -0800 (PST)\r
+Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162])\r
+ by smtp.gmail.com with ESMTPSA id bg10sm22552406wjb.46.2015.12.20.01.07.37\r
+ (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+ Sun, 20 Dec 2015 01:07:37 -0800 (PST)\r
+From: Mark Walters <markwalters1009@gmail.com>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH] emacs: address completion, allow sender/recipient and filters\r
+Date: Sun, 20 Dec 2015 09:07:33 +0000\r
+Message-Id: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com>\r
+X-Mailer: git-send-email 2.1.4\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sun, 20 Dec 2015 09:07:42 -0000\r
+\r
+This commit lets the user customize the address completion.\r
+\r
+The first change controls whether to build the address completion list\r
+based on messages you have sent or you have received (the latter is\r
+much faster).\r
+\r
+The second change add a possible filter query to limit the messages\r
+used -- for example, setting this to date:1y.. would limit the\r
+address completions to addresses used in the last year. This speeds up\r
+the address harvest and may also make the search less cluttered as old\r
+addresses may well no longer be valid.\r
+---\r
+\r
+There was some discussion on irc about the address completion harvest\r
+taking a long time. This patch makes is possible to tune this\r
+behaviour. It may be that this complicates the customize variable too\r
+much -- but if nothing else its a patch that anyone who experiences\r
+problems can try.\r
+\r
+Best wishes\r
+\r
+Mark\r
+\r
+emacs/notmuch-address.el | 64 +++++++++++++++++++++++++++++++++---------------\r
+ 1 file changed, 44 insertions(+), 20 deletions(-)\r
+\r
+diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el\r
+index 49e2402..8942fe4 100644\r
+--- a/emacs/notmuch-address.el\r
++++ b/emacs/notmuch-address.el\r
+@@ -26,15 +26,40 @@\r
+ ;;\r
+ (declare-function company-manual-begin "company")\r
+ \r
++(defvar notmuch-address-last-harvest 0\r
++ "Time of last address harvest")\r
++\r
++(defvar notmuch-address-completions (make-hash-table :test 'equal)\r
++ "Hash of email addresses for completion during email composition.\r
++ This variable is set by calling `notmuch-address-harvest'.")\r
++\r
++(defvar notmuch-address-full-harvest-finished nil\r
++ "t indicates that full completion address harvesting has been\r
++finished")\r
++\r
+ (defcustom notmuch-address-command 'internal\r
+ "The command which generates possible addresses. It must take a\r
+ single argument and output a list of possible matches, one per\r
+ line. The default value of `internal' uses built-in address\r
+ completion."\r
+ :type '(radio\r
+- (const :tag "Use internal address completion" internal)\r
++ (list :tag "Use internal address completion"\r
++ (radio\r
++ :tag "Build list based on messages you have"\r
++ :value sent\r
++ (const :tag "sent" sent)\r
++ (const :tag "received" received))\r
++ (radio :tag "Filter messages used for completion"\r
++ (const :tag "Use all messages" nil)\r
++ (string :tag "Filter query")))\r
+ (const :tag "Disable address completion" nil)\r
+- (string :tag "Use external completion command" "notmuch-addresses"))\r
++ (string :tag "Use external completion command"))\r
++ ;; We override set so that we can clear the cache when this changes\r
++ :set (lambda (symbol value)\r
++ (set-default symbol value)\r
++ (setq notmuch-address-last-harvest 0)\r
++ (setq notmuch-address-completions (clrhash notmuch-address-completions))\r
++ (setq notmuch-address-full-harvest-finished nil))\r
+ :group 'notmuch-send\r
+ :group 'notmuch-external)\r
+ \r
+@@ -49,17 +74,6 @@ to know how address selection is made by default."\r
+ :group 'notmuch-send\r
+ :group 'notmuch-external)\r
+ \r
+-(defvar notmuch-address-last-harvest 0\r
+- "Time of last address harvest")\r
+-\r
+-(defvar notmuch-address-completions (make-hash-table :test 'equal)\r
+- "Hash of email addresses for completion during email composition.\r
+- This variable is set by calling `notmuch-address-harvest'.")\r
+-\r
+-(defvar notmuch-address-full-harvest-finished nil\r
+- "t indicates that full completion address harvesting has been\r
+-finished")\r
+-\r
+ (defun notmuch-address-selection-function (prompt collection initial-input)\r
+ "Call (`completing-read'\r
+ PROMPT COLLECTION nil nil INITIAL-INPUT 'notmuch-address-history)"\r
+@@ -81,7 +95,8 @@ finished")\r
+ \r
+ (defun notmuch-address-setup ()\r
+ (let* ((use-company (and notmuch-address-use-company\r
+- (eq notmuch-address-command 'internal)\r
++ notmuch-address-command\r
++ (listp notmuch-address-command)\r
+ (require 'company nil t)))\r
+ (pair (cons notmuch-address-completion-headers-regexp\r
+ (if use-company\r
+@@ -109,7 +124,7 @@ The candidates are taken from `notmuch-address-completions'."\r
+ elisp-based implementation or older implementation requiring\r
+ external commands."\r
+ (cond\r
+- ((eq notmuch-address-command 'internal)\r
++ ((and notmuch-address-command (listp notmuch-address-command))\r
+ (when (not notmuch-address-full-harvest-finished)\r
+ ;; First, run quick synchronous harvest based on what the user\r
+ ;; entered so far\r
+@@ -198,12 +213,21 @@ addresses from those messages and stores them in\r
+ time so the address collection runs asynchronously unless\r
+ SYNCHRONOUS is t. In case of asynchronous execution, CALLBACK is\r
+ called when harvesting finishes."\r
+- (let* ((from-me-query (mapconcat (lambda (x) (concat "from:" x)) (notmuch-user-emails) " or "))\r
+- (query (if filter-query\r
+- (format "(%s) and (%s)" from-me-query filter-query)\r
+- from-me-query))\r
++ (let* ((sent (eq (car notmuch-address-command) 'sent))\r
++ (user-query (cadr notmuch-address-command))\r
++ (from-or-to-me-query\r
++ (mapconcat (lambda (x)\r
++ (concat (if sent "from:" "to:") x))\r
++ (notmuch-user-emails) " or "))\r
++ (query (if (or filter-query user-query)\r
++ (concat (format "(%s)" from-or-to-me-query)\r
++ (when filter-query\r
++ (format " and (%s)" filter-query))\r
++ (when user-query\r
++ (format " and (%s)" user-query)))\r
++ from-or-to-me-query))\r
+ (args `("address" "--format=sexp" "--format-version=2"\r
+- "--output=recipients"\r
++ ,(if sent "--output=recipients" "--output=sender")\r
+ "--deduplicate=address"\r
+ ,query)))\r
+ (if synchronous\r
+-- \r
+2.1.4\r
+\r