Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id E42FD6DE119C for ; Mon, 28 Dec 2015 03:50:18 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -1.314 X-Spam-Level: X-Spam-Status: No, score=-1.314 tagged_above=-999 required=5 tests=[AWL=1.536, RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-0.55] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gaO_pmHmWPgR for ; Mon, 28 Dec 2015 03:50:15 -0800 (PST) Received: from max.feld.cvut.cz (max.feld.cvut.cz [147.32.192.36]) by arlo.cworth.org (Postfix) with ESMTP id 4DAAB6DE111A for ; Mon, 28 Dec 2015 03:50:15 -0800 (PST) Received: from localhost (unknown [192.168.200.7]) by max.feld.cvut.cz (Postfix) with ESMTP id 403B819F4819; Mon, 28 Dec 2015 12:50:13 +0100 (CET) X-Virus-Scanned: IMAP STYX AMAVIS Received: from max.feld.cvut.cz ([192.168.200.1]) by localhost (styx.feld.cvut.cz [192.168.200.7]) (amavisd-new, port 10044) with ESMTP id a54nygSRp_w2; Mon, 28 Dec 2015 12:50:11 +0100 (CET) Received: from imap.feld.cvut.cz (imap.feld.cvut.cz [147.32.192.34]) by max.feld.cvut.cz (Postfix) with ESMTP id 1EC6A19F47EA; Mon, 28 Dec 2015 12:50:10 +0100 (CET) Received: from wsh by steelpick.2x.cz with local (Exim 4.86) (envelope-from ) id 1aDWJU-0006IO-HO; Mon, 28 Dec 2015 12:50:08 +0100 From: Michal Sojka To: Mark Walters , notmuch@notmuchmail.org Subject: Re: [PATCH] emacs: address completion, allow sender/recipient and filters In-Reply-To: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com> References: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com> User-Agent: Notmuch/0.21+30~g55c056a (http://notmuchmail.org) Emacs/24.5.1 (x86_64-pc-linux-gnu) Date: Mon, 28 Dec 2015 12:50:08 +0100 Message-ID: <874mf2yeq7.fsf@steelpick.2x.cz> MIME-Version: 1.0 Content-Type: text/plain X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.20 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: Mon, 28 Dec 2015 11:50:19 -0000 Hi Mark, I tried this patch. When I set the variable to 'received, first completion candidates are generated incorrectly. The query looked as "(to:sojkam1@fel.cvut.cz) and (to:prefix*)". It should be "... (from:prefix*)". This "to:" comes from notmuch-address-options or from notmuch-company so these should be changes as well. Other minor comments are below. Thanks. -Michal On Sun, Dec 20 2015, Mark Walters wrote: > This commit lets the user customize the address completion. > > The first change controls whether to build the address completion list > based on messages you have sent or you have received (the latter is > much faster). > > The second change add a possible filter query to limit the messages > used -- for example, setting this to date:1y.. would limit the > address completions to addresses used in the last year. This speeds up > the address harvest and may also make the search less cluttered as old > addresses may well no longer be valid. > --- > > There was some discussion on irc about the address completion harvest > taking a long time. This patch makes is possible to tune this > behaviour. It may be that this complicates the customize variable too > much -- but if nothing else its a patch that anyone who experiences > problems can try. > > Best wishes > > Mark > > emacs/notmuch-address.el | 64 +++++++++++++++++++++++++++++++++--------------- > 1 file changed, 44 insertions(+), 20 deletions(-) > > diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el > index 49e2402..8942fe4 100644 > --- a/emacs/notmuch-address.el > +++ b/emacs/notmuch-address.el > @@ -26,15 +26,40 @@ > ;; > (declare-function company-manual-begin "company") > > +(defvar notmuch-address-last-harvest 0 > + "Time of last address harvest") > + > +(defvar notmuch-address-completions (make-hash-table :test 'equal) > + "Hash of email addresses for completion during email composition. > + This variable is set by calling `notmuch-address-harvest'.") > + > +(defvar notmuch-address-full-harvest-finished nil > + "t indicates that full completion address harvesting has been > +finished") > + > (defcustom notmuch-address-command 'internal Default value should be changed to something matching the :type. Perhaps '(sent nil). > "The command which generates possible addresses. It must take a > single argument and output a list of possible matches, one per > line. The default value of `internal' uses built-in address > completion." Doc text can be updated as well. > :type '(radio > - (const :tag "Use internal address completion" internal) > + (list :tag "Use internal address completion" > + (radio > + :tag "Build list based on messages you have" > + :value sent > + (const :tag "sent" sent) > + (const :tag "received" received)) I would mention that received is faster here. > + (radio :tag "Filter messages used for completion" > + (const :tag "Use all messages" nil) > + (string :tag "Filter query"))) > (const :tag "Disable address completion" nil) > - (string :tag "Use external completion command" "notmuch-addresses")) > + (string :tag "Use external completion command")) > + ;; We override set so that we can clear the cache when this changes > + :set (lambda (symbol value) > + (set-default symbol value) > + (setq notmuch-address-last-harvest 0) > + (setq notmuch-address-completions (clrhash notmuch-address-completions)) > + (setq notmuch-address-full-harvest-finished nil)) > :group 'notmuch-send > :group 'notmuch-external) > > @@ -49,17 +74,6 @@ to know how address selection is made by default." > :group 'notmuch-send > :group 'notmuch-external) > > -(defvar notmuch-address-last-harvest 0 > - "Time of last address harvest") > - > -(defvar notmuch-address-completions (make-hash-table :test 'equal) > - "Hash of email addresses for completion during email composition. > - This variable is set by calling `notmuch-address-harvest'.") > - > -(defvar notmuch-address-full-harvest-finished nil > - "t indicates that full completion address harvesting has been > -finished") > - > (defun notmuch-address-selection-function (prompt collection initial-input) > "Call (`completing-read' > PROMPT COLLECTION nil nil INITIAL-INPUT 'notmuch-address-history)" > @@ -81,7 +95,8 @@ finished") > > (defun notmuch-address-setup () > (let* ((use-company (and notmuch-address-use-company > - (eq notmuch-address-command 'internal) > + notmuch-address-command > + (listp notmuch-address-command) > (require 'company nil t))) > (pair (cons notmuch-address-completion-headers-regexp > (if use-company > @@ -109,7 +124,7 @@ The candidates are taken from `notmuch-address-completions'." > elisp-based implementation or older implementation requiring > external commands." > (cond > - ((eq notmuch-address-command 'internal) > + ((and notmuch-address-command (listp notmuch-address-command)) > (when (not notmuch-address-full-harvest-finished) > ;; First, run quick synchronous harvest based on what the user > ;; entered so far > @@ -198,12 +213,21 @@ addresses from those messages and stores them in > time so the address collection runs asynchronously unless > SYNCHRONOUS is t. In case of asynchronous execution, CALLBACK is > called when harvesting finishes." > - (let* ((from-me-query (mapconcat (lambda (x) (concat "from:" x)) (notmuch-user-emails) " or ")) > - (query (if filter-query > - (format "(%s) and (%s)" from-me-query filter-query) > - from-me-query)) > + (let* ((sent (eq (car notmuch-address-command) 'sent)) > + (user-query (cadr notmuch-address-command)) > + (from-or-to-me-query > + (mapconcat (lambda (x) > + (concat (if sent "from:" "to:") x)) > + (notmuch-user-emails) " or ")) > + (query (if (or filter-query user-query) > + (concat (format "(%s)" from-or-to-me-query) > + (when filter-query > + (format " and (%s)" filter-query)) > + (when user-query > + (format " and (%s)" user-query))) > + from-or-to-me-query)) > (args `("address" "--format=sexp" "--format-version=2" > - "--output=recipients" > + ,(if sent "--output=recipients" "--output=sender") > "--deduplicate=address" > ,query))) > (if synchronous > -- > 2.1.4 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > https://notmuchmail.org/mailman/listinfo/notmuch