From 38b031bc1ddc7584d53b31b7c567e772c3b1920b Mon Sep 17 00:00:00 2001 From: Mark Walters Date: Sun, 14 Feb 2016 21:29:01 +0000 Subject: [PATCH] Re: [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show'. --- d0/f73f28ac3067945d3d6f9c79a883062c09b0a1 | 328 ++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 d0/f73f28ac3067945d3d6f9c79a883062c09b0a1 diff --git a/d0/f73f28ac3067945d3d6f9c79a883062c09b0a1 b/d0/f73f28ac3067945d3d6f9c79a883062c09b0a1 new file mode 100644 index 000000000..151fc41e5 --- /dev/null +++ b/d0/f73f28ac3067945d3d6f9c79a883062c09b0a1 @@ -0,0 +1,328 @@ +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 00AE66DE0A87 + for ; Sun, 14 Feb 2016 13:29:08 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.274 +X-Spam-Level: +X-Spam-Status: No, score=-0.274 tagged_above=-999 required=5 tests=[AWL=0.296, + 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 4BBgytSeopoh for ; + Sun, 14 Feb 2016 13:29:05 -0800 (PST) +Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com + [74.125.82.68]) by arlo.cworth.org (Postfix) with ESMTPS id A87396DE0943 for + ; Sun, 14 Feb 2016 13:29:04 -0800 (PST) +Received: by mail-wm0-f68.google.com with SMTP id a4so7528268wme.3 + for ; Sun, 14 Feb 2016 13:29:04 -0800 (PST) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; + h=from:to:subject:in-reply-to:references:user-agent:date:message-id + :mime-version:content-type; + bh=XA7mEG78e7r9y6lLIJuzTF7y4+9tyTiQRFNnPf3KoEE=; + b=0v8PLIMTr+YC1nMNY5S58mluVcHEeecnb/X8Y7ubkDxhldQllfsOjD7LGWQC9h9HcC + 9WAfFAdKHmuXHTQhw31lGWi94i4NmB7zJ9Wzchjdw/eKfO8En33jVwXnQAjNHYFBnybM + ZcSqfJ7NH8RWxp/RQlQpxjjFohvnY5pmpElmhLF3Jt8HYw1fFjGclf4X4oq2JACKBA7/ + tujB+TMHpADJ2G8MeCeoGxWNFvt0bTYcVgh3RuBkLobPUhcGJhVtI9TfGKkGSBNpj0Z3 + te28KHlUa2QHa5e1yJjp8/raaRU+m/Ub54/BpHnK2jERVl5IhlZ9Gir82Mb73vdbm830 + IDDw== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20130820; + h=x-gm-message-state:from:to:subject:in-reply-to:references + :user-agent:date:message-id:mime-version:content-type; + bh=XA7mEG78e7r9y6lLIJuzTF7y4+9tyTiQRFNnPf3KoEE=; + b=F4eguX8CSc88OWV8yKTR2h4y1Eilivijj3+yOmECQJOpBa1kHOptaMEdaJApk4C/RT + a6JekneLeE7F27mQQxWr8dee7kqMYWWzf42uar8EoF2MPZ5q5gHRfcUuNBJvnGdCYi7G + wwTXc5JJolWQY6tRel4qTYp/PB+5yFF7dkCtjlfmJ8VJTLvq73YszTVGQjDVKehk3yoE + IvZ/OgoLA/UhqLBi23ZqD4RozhS+PWV8OudXMuy8RQrxO998FU+ZEODrG8fXpiJbsNFV + BaaCLl/sshX+c2F7S7dqLlyHRz8r88Dd2JmE2cD7yCl0xRbct9pS0zZBwXesF62OCg1e + mdSA== +X-Gm-Message-State: + AG10YOTK4MlSnZdX/PWJg1cbLcMjqxMm41apocbOEa+eBLccvMWqgzEHvfhYLMR302X6UQ== +X-Received: by 10.28.100.7 with SMTP id y7mr7061250wmb.87.1455485343170; + Sun, 14 Feb 2016 13:29:03 -0800 (PST) +Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162]) + by smtp.gmail.com with ESMTPSA id v191sm12578514wme.1.2016.02.14.13.29.02 + (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Sun, 14 Feb 2016 13:29:02 -0800 (PST) +From: Mark Walters +To: David Edmondson , notmuch@notmuchmail.org +Subject: Re: [PATCH v3] emacs: Report a lack of matches when calling + `notmuch-show'. +In-Reply-To: <1455179607-16870-2-git-send-email-dme@dme.org> +References: <1455179607-16870-1-git-send-email-dme@dme.org> + <1455179607-16870-2-git-send-email-dme@dme.org> +User-Agent: Notmuch/0.18.1+485~gca076ce (http://notmuchmail.org) Emacs/24.4.1 + (x86_64-pc-linux-gnu) +Date: Sun, 14 Feb 2016 21:29:01 +0000 +Message-ID: <87vb5rrnfm.fsf@qmul.ac.uk> +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: Sun, 14 Feb 2016 21:29:08 -0000 + + +Just to confirm that this LGTM +1. + +Best wishes + +Mark + +On Thu, 11 Feb 2016, David Edmondson wrote: +> If the basic query passed to `notmuch-show' generates no results, ring +> the bell and inform the user that no messages matched the query rather +> than displaying an empty buffer and showing an obscure error. +> +> Similarly when refreshing a `notmuch-show' buffer and no messages match. +> --- +> emacs/notmuch-show.el | 144 +++++++++++++++++++++++++++++--------------------- +> emacs/notmuch.el | 6 ++- +> 2 files changed, 89 insertions(+), 61 deletions(-) +> +> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el +> index 3345878..4629c64 100644 +> --- a/emacs/notmuch-show.el +> +++ b/emacs/notmuch-show.el +> @@ -153,27 +153,21 @@ indentation." +> +> (defvar notmuch-show-thread-id nil) +> (make-variable-buffer-local 'notmuch-show-thread-id) +> -(put 'notmuch-show-thread-id 'permanent-local t) +> +> (defvar notmuch-show-parent-buffer nil) +> (make-variable-buffer-local 'notmuch-show-parent-buffer) +> -(put 'notmuch-show-parent-buffer 'permanent-local t) +> +> (defvar notmuch-show-query-context nil) +> (make-variable-buffer-local 'notmuch-show-query-context) +> -(put 'notmuch-show-query-context 'permanent-local t) +> +> (defvar notmuch-show-process-crypto nil) +> (make-variable-buffer-local 'notmuch-show-process-crypto) +> -(put 'notmuch-show-process-crypto 'permanent-local t) +> +> (defvar notmuch-show-elide-non-matching-messages nil) +> (make-variable-buffer-local 'notmuch-show-elide-non-matching-messages) +> -(put 'notmuch-show-elide-non-matching-messages 'permanent-local t) +> +> (defvar notmuch-show-indent-content t) +> (make-variable-buffer-local 'notmuch-show-indent-content) +> -(put 'notmuch-show-indent-content 'permanent-local t) +> +> (defvar notmuch-show-attachment-debug nil +> "If t log stdout and stderr from attachment handlers +> @@ -1197,71 +1191,101 @@ non-nil. +> The optional BUFFER-NAME provides the name of the buffer in +> which the message thread is shown. If it is nil (which occurs +> when the command is called interactively) the argument to the +> -function is used." +> +function is used. +> + +> +Returns the buffer containing the messages, or NIL if no messages +> +matched." +> (interactive "sNotmuch show: \nP") +> (let ((buffer-name (generate-new-buffer-name +> (or buffer-name +> (concat "*notmuch-" thread-id "*"))))) +> (switch-to-buffer (get-buffer-create buffer-name)) +> - ;; Set the default value for `notmuch-show-process-crypto' in this +> - ;; buffer. +> - (setq notmuch-show-process-crypto notmuch-crypto-process-mime) +> - ;; Set the default value for +> - ;; `notmuch-show-elide-non-matching-messages' in this buffer. If +> - ;; elide-toggle is set, invert the default. +> - (setq notmuch-show-elide-non-matching-messages notmuch-show-only-matching-messages) +> - (if elide-toggle +> - (setq notmuch-show-elide-non-matching-messages (not notmuch-show-elide-non-matching-messages))) +> + ;; No need to track undo information for this buffer. +> + (setq buffer-undo-list t) +> + +> + (notmuch-show-mode) +> +> + ;; Set various buffer local variables to their appropriate initial +> + ;; state. Do this after enabling `notmuch-show-mode' so that they +> + ;; aren't wiped out. +> (setq notmuch-show-thread-id thread-id +> notmuch-show-parent-buffer parent-buffer +> - notmuch-show-query-context query-context) +> - (notmuch-show-build-buffer) +> - (notmuch-show-goto-first-wanted-message) +> - (current-buffer))) +> + notmuch-show-query-context query-context +> +> -(defun notmuch-show-build-buffer () +> - (let ((inhibit-read-only t)) +> + notmuch-show-process-crypto notmuch-crypto-process-mime +> + ;; If `elide-toggle', invert the default value. +> + notmuch-show-elide-non-matching-messages +> + (if elide-toggle +> + (not notmuch-show-only-matching-messages) +> + notmuch-show-only-matching-messages)) +> +> - (notmuch-show-mode) +> (add-hook 'post-command-hook #'notmuch-show-command-hook nil t) +> - +> - ;; Don't track undo information for this buffer +> - (set 'buffer-undo-list t) +> + (jit-lock-register #'notmuch-show-buttonise-links) +> +> (notmuch-tag-clear-cache) +> - (erase-buffer) +> - (goto-char (point-min)) +> - (save-excursion +> - (let* ((basic-args (list notmuch-show-thread-id)) +> - (args (if notmuch-show-query-context +> - (append (list "\'") basic-args +> - (list "and (" notmuch-show-query-context ")\'")) +> - (append (list "\'") basic-args (list "\'")))) +> - (cli-args (cons "--exclude=false" +> - (when notmuch-show-elide-non-matching-messages +> - (list "--entire-thread=false"))))) +> - +> - (notmuch-show-insert-forest (notmuch-query-get-threads (append cli-args args))) +> - ;; If the query context reduced the results to nothing, run +> - ;; the basic query. +> - (when (and (eq (buffer-size) 0) +> - notmuch-show-query-context) +> - (notmuch-show-insert-forest +> - (notmuch-query-get-threads (append cli-args basic-args))))) +> - +> - (jit-lock-register #'notmuch-show-buttonise-links) +> - +> - (notmuch-show-mapc (lambda () (notmuch-show-set-prop :orig-tags (notmuch-show-get-tags)))) +> + +> + (let ((inhibit-read-only t)) +> + (if (notmuch-show--build-buffer) +> + ;; Messages were inserted into the buffer. +> + (current-buffer) +> + +> + ;; No messages were inserted - presumably none matched the +> + ;; query. +> + (kill-buffer (current-buffer)) +> + (ding) +> + (message "No messages matched the query!") +> + nil)))) +> + +> +(defun notmuch-show--build-buffer (&optional state) +> + "Display messages matching the current buffer context. +> + +> +Apply the previously saved STATE if supplied, otherwise show the +> +first relevant message. +> + +> +If no messages match the query return NIL." +> + (let* ((basic-args (list notmuch-show-thread-id)) +> + (args (if notmuch-show-query-context +> + (append (list "\'") basic-args +> + (list "and (" notmuch-show-query-context ")\'")) +> + (append (list "\'") basic-args (list "\'")))) +> + (cli-args (cons "--exclude=false" +> + (when notmuch-show-elide-non-matching-messages +> + (list "--entire-thread=false")))) +> + +> + (forest (or (notmuch-query-get-threads (append cli-args args)) +> + ;; If a query context reduced the number of +> + ;; results to zero, try again without it. +> + (and notmuch-show-query-context +> + (notmuch-query-get-threads (append cli-args basic-args))))) +> + +> + ;; Must be reset every time we are going to start inserting +> + ;; messages into the buffer. +> + (notmuch-show-previous-subject "")) +> + +> + (when forest +> + (notmuch-show-insert-forest forest) +> + +> + ;; Store the original tags for each message so that we can +> + ;; display changes. +> + (notmuch-show-mapc +> + (lambda () (notmuch-show-set-prop :orig-tags (notmuch-show-get-tags)))) +> +> ;; Set the header line to the subject of the first message. +> (setq header-line-format +> (replace-regexp-in-string "%" "%%" +> - (notmuch-sanitize +> - (notmuch-show-strip-re +> - (notmuch-show-get-subject))))) +> + (notmuch-sanitize +> + (notmuch-show-strip-re +> + (notmuch-show-get-subject))))) +> +> - (run-hooks 'notmuch-show-hook)))) +> + (run-hooks 'notmuch-show-hook) +> + +> + (if state +> + (notmuch-show-apply-state state) +> + ;; With no state to apply, just go to the first message. +> + (notmuch-show-goto-first-wanted-message))) +> + +> + ;; Report back to the caller whether any messages matched. +> + forest)) +> +> (defun notmuch-show-capture-state () +> "Capture the state of the current buffer. +> @@ -1320,17 +1344,17 @@ reset based on the original query." +> (let ((inhibit-read-only t) +> (state (unless reset-state +> (notmuch-show-capture-state)))) +> - ;; erase-buffer does not seem to remove overlays, which can lead +> + ;; `erase-buffer' does not seem to remove overlays, which can lead +> ;; to weird effects such as remaining images, so remove them +> ;; manually. +> (remove-overlays) +> (erase-buffer) +> - (notmuch-show-build-buffer) +> - (if state +> - (notmuch-show-apply-state state) +> - ;; We're resetting state, so navigate to the first open message +> - ;; and mark it read, just like opening a new show buffer. +> - (notmuch-show-goto-first-wanted-message)))) +> + +> + (unless (notmuch-show--build-buffer state) +> + ;; No messages were inserted. +> + (kill-buffer (current-buffer)) +> + (ding) +> + (message "Refreshing the buffer resulted in no messages!")))) +> +> (defvar notmuch-show-stash-map +> (let ((map (make-sparse-keymap))) +> diff --git a/emacs/notmuch.el b/emacs/notmuch.el +> index 463b926..3100b97 100644 +> --- a/emacs/notmuch.el +> +++ b/emacs/notmuch.el +> @@ -458,7 +458,11 @@ no messages in the region then return nil." +> (notmuch-search-properties-in-region :subject beg end)) +> +> (defun notmuch-search-show-thread (&optional elide-toggle) +> - "Display the currently selected thread." +> + "Display the currently selected thread. +> + +> +With a prefix argument, invert the default value of +> +`notmuch-show-only-matching-messages' when displaying the +> +thread." +> (interactive "P") +> (let ((thread-id (notmuch-search-find-thread-id)) +> (subject (notmuch-search-find-subject))) +> -- +> 2.1.4 +> +> _______________________________________________ +> notmuch mailing list +> notmuch@notmuchmail.org +> https://notmuchmail.org/mailman/listinfo/notmuch -- 2.26.2