Re: [Patch v7 3/3] Emacs: Add address completion based on company-mode
authorMark Walters <markwalters1009@gmail.com>
Sun, 25 Oct 2015 17:26:25 +0000 (17:26 +0000)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 21:49:55 +0000 (14:49 -0700)
e6/d0e25ab40ade55f62b3733927e66e7c3ec19fb [new file with mode: 0644]

diff --git a/e6/d0e25ab40ade55f62b3733927e66e7c3ec19fb b/e6/d0e25ab40ade55f62b3733927e66e7c3ec19fb
new file mode 100644 (file)
index 0000000..f3d15a9
--- /dev/null
@@ -0,0 +1,275 @@
+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 9FCD76DE1413\r
+ for <notmuch@notmuchmail.org>; Sun, 25 Oct 2015 10:26:34 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0.252\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0.252 tagged_above=-999 required=5 tests=[AWL=0.078, \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,\r
+ RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01,\r
+ RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001, URIBL_SBL=0.644,\r
+ URIBL_SBL_A=0.1] 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 Y4h1L34iVhTl for <notmuch@notmuchmail.org>;\r
+ Sun, 25 Oct 2015 10:26:30 -0700 (PDT)\r
+Received: from mail-wi0-f173.google.com (mail-wi0-f173.google.com\r
+ [209.85.212.173])\r
+ by arlo.cworth.org (Postfix) with ESMTPS id 52CC96DE1405\r
+ for <notmuch@notmuchmail.org>; Sun, 25 Oct 2015 10:26:30 -0700 (PDT)\r
+Received: by wicfv8 with SMTP id fv8so87429730wic.0\r
+ for <notmuch@notmuchmail.org>; Sun, 25 Oct 2015 10:26:28 -0700 (PDT)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\r
+ h=from:to:subject:in-reply-to:references:user-agent:date:message-id\r
+ :mime-version:content-type;\r
+ bh=AkzkUxHyVkx5AjXNSoeCEuIqxGb5E3sQNGVlei9ZISg=;\r
+ b=JOmp2LNx4r9+22TVgSvE6x4LK1cnVfvaD0X29UgrgUHArmkCEqxRNLlEKZCYNiqAYZ\r
+ nUUMwcGtmmhUmQdxTFdFccTcOmxcCJ+Y7MyEzBa/Z+DWnOigOsAIcdNpRYQDvYJRYYhu\r
+ fiQ/66kYv/t1SeB8b133tbsJSMAzqETU2Xw/yDIAU+gEuoNW48Rz4jVvL2oy1m/Xqaga\r
+ KoTZr9Td1UbxiRdo0o8bx0LjGtPUC+Wi7kOrUyCN6PyH/hSoiSB/zWhSvdDLRk/QUkmb\r
+ 09moY1FH9kCdXb//Qj87krTZFvokqttF5AQnMfuqHtgQvHIoq/Ekfhz8gCwzOovu5Jf6\r
+ y4IQ==\r
+X-Received: by 10.180.74.80 with SMTP id r16mr16783084wiv.88.1445793988344;\r
+ Sun, 25 Oct 2015 10:26:28 -0700 (PDT)\r
+Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162])\r
+ by smtp.gmail.com with ESMTPSA id w9sm12984313wjf.20.2015.10.25.10.26.26\r
+ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+ Sun, 25 Oct 2015 10:26:27 -0700 (PDT)\r
+From: Mark Walters <markwalters1009@gmail.com>\r
+To: David Bremner <david@tethera.net>, notmuch@notmuchmail.org\r
+Subject: Re: [Patch v7 3/3] Emacs: Add address completion based on\r
+ company-mode\r
+In-Reply-To: <1445786638-13763-4-git-send-email-david@tethera.net>\r
+References: <1445786638-13763-1-git-send-email-david@tethera.net>\r
+ <1445786638-13763-4-git-send-email-david@tethera.net>\r
+User-Agent: Notmuch/0.21~rc1+29~g057f24d (http://notmuchmail.org) Emacs/23.4.1\r
+ (x86_64-pc-linux-gnu)\r
+Date: Sun, 25 Oct 2015 17:26:25 +0000\r
+Message-ID: <87bnbmdflq.fsf@qmul.ac.uk>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=us-ascii\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, 25 Oct 2015 17:26:34 -0000\r
+\r
+\r
+On Sun, 25 Oct 2015, David Bremner <david@tethera.net> wrote:\r
+> From: Michal Sojka <sojkam1@fel.cvut.cz>\r
+>\r
+> With this patch, address completion candidates are shown automatically\r
+> after short typing delay in a nice popup box. This requires company-mode\r
+> to be installed and it works only on Emacs >= 24. The completion is\r
+> based entirely on the asynchronous address harvesting from\r
+> notmuch-address.el so the GUI is theoretically not blocked for long\r
+> time.\r
+>\r
+> The completion works similarly as the TAB-initiated completion from\r
+> notmuch-address.el, i.e. quick harvest based on user input is executed\r
+> first and only after full harvesting is finished, in-memory cached data\r
+> is used.\r
+> ---\r
+\r
+This series looks good to me. There are a couple of very small nits that\r
+might be worth fixing (on the level of typos/whitespace see below and a\r
+reply to patch 2). But +1 from me for this version.\r
+\r
+\r
+Best wishes\r
+\r
+Mark\r
+\r
+>  emacs/Makefile.local     |  1 +\r
+>  emacs/notmuch-address.el | 18 ++++++++--\r
+>  emacs/notmuch-company.el | 86 ++++++++++++++++++++++++++++++++++++++++++++++++\r
+>  emacs/notmuch-mua.el     |  2 +-\r
+>  4 files changed, 104 insertions(+), 3 deletions(-)\r
+>  create mode 100644 emacs/notmuch-company.el\r
+>\r
+> diff --git a/emacs/Makefile.local b/emacs/Makefile.local\r
+> index 1109cfa..4c06c52 100644\r
+> --- a/emacs/Makefile.local\r
+> +++ b/emacs/Makefile.local\r
+> @@ -20,6 +20,7 @@ emacs_sources := \\r
+>      $(dir)/notmuch-print.el \\r
+>      $(dir)/notmuch-version.el \\r
+>      $(dir)/notmuch-jump.el \\r
+> +    $(dir)/notmuch-company.el\r
+>  \r
+>  $(dir)/notmuch-version.el: $(dir)/Makefile.local version.stamp\r
+>  $(dir)/notmuch-version.el: $(srcdir)/$(dir)/notmuch-version.el.tmpl\r
+> diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el\r
+> index aa6228d..5456d5c 100644\r
+> --- a/emacs/notmuch-address.el\r
+> +++ b/emacs/notmuch-address.el\r
+> @@ -22,7 +22,9 @@\r
+>  (require 'message)\r
+>  (require 'notmuch-parser)\r
+>  (require 'notmuch-lib)\r
+> +(require 'notmuch-company)\r
+>  ;;\r
+> +(declare-function company-manual-begin "company")\r
+>  \r
+>  (defcustom notmuch-address-command 'internal\r
+>    "The command which generates possible addresses. It must take a\r
+> @@ -72,9 +74,21 @@ finished")\r
+>  (defun notmuch-address-message-insinuate ()\r
+>    (message "calling notmuch-address-message-insinuate is no longer needed"))\r
+>  \r
+> +(defcustom notmuch-address-use-company t\r
+> +  "If available, use company mode for address completion"\r
+> +  :type 'boolean\r
+> +  :group 'notmuch-send)\r
+> +\r
+>  (defun notmuch-address-setup ()\r
+> -  (let ((pair (cons notmuch-address-completion-headers-regexp\r
+> -                #'notmuch-address-expand-name)))\r
+> +  (let* ((use-company (and notmuch-address-use-company\r
+> +                       (eq notmuch-address-command 'internal)\r
+> +                       (require 'company nil t)))\r
+> +     (pair (cons notmuch-address-completion-headers-regexp\r
+> +                 (if use-company\r
+> +                     #'company-manual-begin\r
+> +                   #'notmuch-address-expand-name))))\r
+> +      (when use-company\r
+> +    (notmuch-company-setup))\r
+>        (unless (memq pair message-completion-alist)\r
+>      (setq message-completion-alist\r
+>            (push pair message-completion-alist)))))\r
+> diff --git a/emacs/notmuch-company.el b/emacs/notmuch-company.el\r
+> new file mode 100644\r
+> index 0000000..49d1d81\r
+> --- /dev/null\r
+> +++ b/emacs/notmuch-company.el\r
+> @@ -0,0 +1,86 @@\r
+> +;; notmuch-company.el --- Mail address completion for notmuch via company-mode  -*- lexical-binding: t -*-\r
+> +\r
+> +;; Authors: Trevor Jim <tjim@mac.com>\r
+> +;;      Michal Sojka <sojkam1@fel.cvut.cz>\r
+> +;;\r
+> +;; Keywords: mail, completion\r
+> +\r
+> +;; This program is free software; you can redistribute it and/or modify\r
+> +;; it under the terms of the GNU General Public License as published by\r
+> +;; the Free Software Foundation, either version 3 of the License, or\r
+> +;; (at your option) any later version.\r
+> +\r
+> +;; This program is distributed in the hope that it will be useful,\r
+> +;; but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+> +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+> +;; GNU General Public License for more details.\r
+> +\r
+> +;; You should have received a copy of the GNU General Public License\r
+> +;; along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+> +\r
+> +;;; Commentary:\r
+> +\r
+> +;; To enable this, install company mode (https://company-mode.github.io/)\r
+> +;;\r
+> +;; NB company-minimum-prefix-length defaults to 3 so you don't get\r
+> +;; completion unless you type 3 characters\r
+> +\r
+> +;;; Code:\r
+> +\r
+> +(eval-when-compile (require 'cl))\r
+> +\r
+> +(defvar notmuch-company-last-prefix nil)\r
+> +(make-variable-buffer-local 'notmuch-company-last-prefix)\r
+> +(declare-function company-begin-backend "company")\r
+> +(declare-function company-grab "company")\r
+> +(declare-function company-mode "company")\r
+> +(declare-function company-manual-begin "company")\r
+> +(defvar company-backends)\r
+> +\r
+> +(declare-function notmuch-address-harvest "notmuch-address")\r
+> +(declare-function notmuch-address-harvest-trigger "notmuch-address")\r
+> +(declare-function notmuch-address-matching "notmuch-address")\r
+> +(defvar notmuch-address-full-harvest-finished)\r
+> +(defvar notmuch-address-completion-headers-regexp)\r
+> +\r
+> +;;;###autoload\r
+> +(defun notmuch-company-setup ()\r
+> +  (company-mode)\r
+> +  (make-local-variable 'company-backends)\r
+> +  (setq company-backends '(notmuch-company)))\r
+> +\r
+> +;;;###autoload\r
+> +(defun notmuch-company (command &optional arg &rest _ignore)\r
+> +  "`company-mode' completion back-end for `notmuch'."\r
+> +  (interactive (list 'interactive))\r
+> +  (require 'company)\r
+> +  (let ((case-fold-search t)\r
+> +    (completion-ignore-case t))\r
+> +    (case command\r
+> +      (interactive (company-begin-backend 'notmuch-company))\r
+> +      (prefix (and (derived-mode-p 'message-mode)\r
+> +               (looking-back (concat notmuch-address-completion-headers-regexp ".*")\r
+> +                             (line-beginning-position))\r
+> +               (setq notmuch-company-last-prefix (company-grab "[:,][ \t]*\\(.*\\)" 1 (point-at-bol)))))\r
+> +      (candidates (cond\r
+> +               (notmuch-address-full-harvest-finished\r
+> +                ;; Update harvested addressed from time to time\r
+> +                (notmuch-address-harvest-trigger)\r
+> +                (notmuch-address-matching arg))\r
+> +               (t\r
+> +                (cons :async\r
+> +                      (lambda (callback)\r
+> +                        ;; First run quick asynchronous harvest based on what the user entered so far\r
+> +                        (notmuch-address-harvest\r
+> +                         (format "to:%s*" arg) nil\r
+> +                         (lambda (_proc _event)\r
+> +                           (funcall callback (notmuch-address-matching arg))\r
+> +                           ;; Then (re)start potentially long-running full asynchronous harvesting\r
+> +                           (notmuch-address-harvest-trigger))))))))\r
+\r
+Could we reword this comment? restart definitely suggests to me starting\r
+a stopped/paused thing not starting it for a second run. Perhaps "Start\r
+the (potentially long-running) full asynchronous harvest if necessary"?\r
+(The same comment occurs in Patch 2)\r
+\r
\r
+> +      (match (if (string-match notmuch-company-last-prefix arg)\r
+> +             (match-end 0)\r
+> +           0))\r
+> +      (no-cache t))))\r
+> +\r
+> +\r
+> +(provide 'notmuch-company)\r
+> diff --git a/emacs/notmuch-mua.el b/emacs/notmuch-mua.el\r
+> index fd98ea4..c12054c 100644\r
+> --- a/emacs/notmuch-mua.el\r
+> +++ b/emacs/notmuch-mua.el\r
+> @@ -271,7 +271,7 @@ Note that these functions use `mail-citation-hook' if that is non-nil."\r
+>  (define-derived-mode notmuch-message-mode message-mode "Message[Notmuch]"\r
+>    "Notmuch message composition mode. Mostly like `message-mode'"\r
+>    (when notmuch-address-command\r
+> -    (notmuch-address-setup)))\r
+> +      (notmuch-address-setup)))\r
+\r
+An accidental whitespace change? There were also a couple on\r
+added/deleted lines in the earlier patches.\r
+\r
+>  \r
+>  (define-key notmuch-message-mode-map (kbd "C-c C-c") #'notmuch-mua-send-and-exit)\r
+>  (define-key notmuch-message-mode-map (kbd "C-c C-s") #'notmuch-mua-send)\r
+> -- \r
+> 2.6.1\r
+>\r
+> _______________________________________________\r
+> notmuch mailing list\r
+> notmuch@notmuchmail.org\r
+> https://notmuchmail.org/mailman/listinfo/notmuch\r