Re: [PATCH] emacs: address completion, allow sender/recipient and filters
authorMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 28 Dec 2015 11:50:08 +0000 (12:50 +0100)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 21:50:14 +0000 (14:50 -0700)
7c/b17ec00db48d49b968970c2dcb5892291e4cd9 [new file with mode: 0644]

diff --git a/7c/b17ec00db48d49b968970c2dcb5892291e4cd9 b/7c/b17ec00db48d49b968970c2dcb5892291e4cd9
new file mode 100644 (file)
index 0000000..5e13cb0
--- /dev/null
@@ -0,0 +1,226 @@
+Return-Path: <sojkam1@fel.cvut.cz>\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 E42FD6DE119C\r
+ for <notmuch@notmuchmail.org>; Mon, 28 Dec 2015 03:50:18 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -1.314\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-1.314 tagged_above=-999 required=5 tests=[AWL=1.536,\r
+  RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-0.55] 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 gaO_pmHmWPgR for <notmuch@notmuchmail.org>;\r
+ Mon, 28 Dec 2015 03:50:15 -0800 (PST)\r
+Received: from max.feld.cvut.cz (max.feld.cvut.cz [147.32.192.36])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 4DAAB6DE111A\r
+ for <notmuch@notmuchmail.org>; Mon, 28 Dec 2015 03:50:15 -0800 (PST)\r
+Received: from localhost (unknown [192.168.200.7])\r
+ by max.feld.cvut.cz (Postfix) with ESMTP id 403B819F4819;\r
+ Mon, 28 Dec 2015 12:50:13 +0100 (CET)\r
+X-Virus-Scanned: IMAP STYX AMAVIS\r
+Received: from max.feld.cvut.cz ([192.168.200.1])\r
+ by localhost (styx.feld.cvut.cz [192.168.200.7]) (amavisd-new, port 10044)\r
+ with ESMTP id a54nygSRp_w2; Mon, 28 Dec 2015 12:50:11 +0100 (CET)\r
+Received: from imap.feld.cvut.cz (imap.feld.cvut.cz [147.32.192.34])\r
+ by max.feld.cvut.cz (Postfix) with ESMTP id 1EC6A19F47EA;\r
+ Mon, 28 Dec 2015 12:50:10 +0100 (CET)\r
+Received: from wsh by steelpick.2x.cz with local (Exim 4.86)\r
+ (envelope-from <sojkam1@fel.cvut.cz>)\r
+ id 1aDWJU-0006IO-HO; Mon, 28 Dec 2015 12:50:08 +0100\r
+From: Michal Sojka <sojkam1@fel.cvut.cz>\r
+To: Mark Walters <markwalters1009@gmail.com>, notmuch@notmuchmail.org\r
+Subject: Re: [PATCH] emacs: address completion,\r
+ allow sender/recipient and filters\r
+In-Reply-To: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com>\r
+References: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com>\r
+User-Agent: Notmuch/0.21+30~g55c056a (http://notmuchmail.org) Emacs/24.5.1\r
+ (x86_64-pc-linux-gnu)\r
+Date: Mon, 28 Dec 2015 12:50:08 +0100\r
+Message-ID: <874mf2yeq7.fsf@steelpick.2x.cz>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain\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: Mon, 28 Dec 2015 11:50:19 -0000\r
+\r
+Hi Mark,\r
+\r
+I tried this patch. When I set the variable to 'received, first\r
+completion candidates are generated incorrectly. The query looked as\r
+"(to:sojkam1@fel.cvut.cz) and (to:prefix*)". It should be "...\r
+(from:prefix*)". This "to:" comes from notmuch-address-options or from\r
+notmuch-company so these should be changes as well.\r
+\r
+Other minor comments are below.\r
+\r
+Thanks.\r
+-Michal\r
+\r
+On Sun, Dec 20 2015, Mark Walters wrote:\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
+\r
+Default value should be changed to something matching the :type. Perhaps\r
+'(sent nil).\r
+\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
+\r
+Doc text can be updated as well.\r
+\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
+\r
+I would mention that received is faster here.\r
+\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
+> _______________________________________________\r
+> notmuch mailing list\r
+> notmuch@notmuchmail.org\r
+> https://notmuchmail.org/mailman/listinfo/notmuch\r