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 4A0576DE1413 for ; Sun, 20 Dec 2015 01:07:42 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.182 X-Spam-Level: X-Spam-Status: No, score=-0.182 tagged_above=-999 required=5 tests=[AWL=0.388, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] 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 JBsfF0OTbFrv for ; Sun, 20 Dec 2015 01:07:40 -0800 (PST) Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by arlo.cworth.org (Postfix) with ESMTPS id 2021E6DE025F for ; Sun, 20 Dec 2015 01:07:40 -0800 (PST) Received: by mail-wm0-f45.google.com with SMTP id p187so34903007wmp.0 for ; Sun, 20 Dec 2015 01:07:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=OQGCT/U+8gD2am7zCk22VjLtzaXxa1cjiwIJGaArSgU=; b=VFTmysfWkrPGhSGzYf/5qCS2hY4+7okEPvJLb9tR76a6r541gbz1t1bQZCbGGzrkLv 3Nqu7CK46VutkURpwtPrDU3zfwD0zY8Xp8CB4vm/kr/+auyzJy8xdq7Mvuj+JWyRThic +VOkLSJfsnsO96n/BJGCb+o3F1Gf93S5FbPPdF5c8Oh4dsETWXqHm8guqqN8Qzjo+pEB OrOghHPBfQDCgHwU/3iWJU+sRTi+V4wr8wstQCXvzCLWes0ox+b1fiSucNOgRweL7Qph qvUHhPaiDXa4gQPGpBWAPVZRVb+GY0Vs7c2I+gVc5z66Agf87ZXhP2gmWnCNEIbipcsa YmRQ== X-Received: by 10.28.125.201 with SMTP id y192mr13586178wmc.23.1450602458320; Sun, 20 Dec 2015 01:07:38 -0800 (PST) Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162]) by smtp.gmail.com with ESMTPSA id bg10sm22552406wjb.46.2015.12.20.01.07.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 20 Dec 2015 01:07:37 -0800 (PST) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH] emacs: address completion, allow sender/recipient and filters Date: Sun, 20 Dec 2015 09:07:33 +0000 Message-Id: <1450602453-2623-1-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 2.1.4 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: Sun, 20 Dec 2015 09:07:42 -0000 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 "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." :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)) + (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