From 5b2ef46606a512280faf4106c62706b4a8e445cd Mon Sep 17 00:00:00 2001 From: Mark Walters Date: Wed, 10 Feb 2016 18:50:14 +0000 Subject: [PATCH] Re: [PATCH v2] emacs: Report a lack of matches when calling `notmuch-show'. --- 64/e33e93b13114a717f5eb6607f1c50bdec28497 | 345 ++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 64/e33e93b13114a717f5eb6607f1c50bdec28497 diff --git a/64/e33e93b13114a717f5eb6607f1c50bdec28497 b/64/e33e93b13114a717f5eb6607f1c50bdec28497 new file mode 100644 index 000000000..819b052eb --- /dev/null +++ b/64/e33e93b13114a717f5eb6607f1c50bdec28497 @@ -0,0 +1,345 @@ +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 080AC6DE0BF6 + for ; Wed, 10 Feb 2016 10:50:21 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.231 +X-Spam-Level: +X-Spam-Status: No, score=-0.231 tagged_above=-999 required=5 tests=[AWL=0.339, + 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 KwcC-TjxzFOD for ; + Wed, 10 Feb 2016 10:50:18 -0800 (PST) +Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com + [74.125.82.65]) by arlo.cworth.org (Postfix) with ESMTPS id 184CB6DE0B36 for + ; Wed, 10 Feb 2016 10:50:18 -0800 (PST) +Received: by mail-wm0-f65.google.com with SMTP id p63so6034401wmp.1 + for ; Wed, 10 Feb 2016 10:50:18 -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=Sz9q4FP8+lzIPxRFUhIYBHYeH7zBzHXgmLnxB1JYcPg=; + b=BTInDxuBVLchMPvv7roA8Xr9Q18mwtLZQXgL+eJcpxY7cpbQQjdTR1+2wKNvv5t73h + Coto3acKo2XQXNYVdrePH1R7GbdzUiexZ6OYmy9TQuVEKTQAFbR8u1LGeB7y4rfB9tqh + YLVRZ4GiW4jCXy/tcY0ueOYhPaHdZW9uvp5VDBSH6DYmyGskqwlwApSmwGfwpyZsvhPD + Vf+Z2k0wXQdpTRPHydSSjecsSJurDHvcBi5R3B8MGI+jq5pyfeDrM3VQS65oDYRd6sWN + 5WlwbIYpEjw8r2l7x50TcnpHpvgnF7JMij3E9lFSky8zP/U2jGT3Vsonqc6UQstMfC8q + 8lXg== +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=Sz9q4FP8+lzIPxRFUhIYBHYeH7zBzHXgmLnxB1JYcPg=; + b=jLR4/33TEe1l/6ezUxNMj1+hkc5nLyFhSNsiJf2k+8aFmx4H2GvQjnpJ+Mg9wypNqT + MdocK2gvwfB/jEe6GOUl3lqAiK5gGpglrTFcUlBh9HYrhQV4dogd0Kw5vF2tbXK+F2mu + 6U2sNXMzoFKRj6rGPp76pjWi2WThf3hMsKlRr01ZvYLocCvBNuOSu/IT1Q67ILJiLL8h + +AqUwG0qSN0mDPQJZHSiTaRrM1Q1EkGfIgpexa+ptcLGJaD9V81Ov6qSix1dwsIb/2dH + aRHdu39YztwsUfYbplwUZf8o5p1OG282oxTJdSKi1yc2xfTKhcF92fqIeXphuIcjqi3R + NEOg== +X-Gm-Message-State: + AG10YOTuogozUK/7YOdEu2gQqe2LxGM9V5QBYKRJUVxjveR7Xd9rbTs//2CKNTONdwTiUQ== +X-Received: by 10.28.174.72 with SMTP id x69mr12665074wme.68.1455130216412; + Wed, 10 Feb 2016 10:50:16 -0800 (PST) +Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162]) + by smtp.gmail.com with ESMTPSA id i12sm4626997wmf.10.2016.02.10.10.50.15 + (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Wed, 10 Feb 2016 10:50:15 -0800 (PST) +From: Mark Walters +To: David Edmondson , notmuch@notmuchmail.org +Subject: Re: [PATCH v2] emacs: Report a lack of matches when calling + `notmuch-show'. +In-Reply-To: <1455112878-23497-2-git-send-email-dme@dme.org> +References: <1455112878-23497-1-git-send-email-dme@dme.org> + <1455112878-23497-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: Wed, 10 Feb 2016 18:50:14 +0000 +Message-ID: <87oabo5rix.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: Wed, 10 Feb 2016 18:50:21 -0000 + + + +On Wed, 10 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. + +This basically looks fine to me and all tests pass. The code movement +and cleanup all looks fine. Two minor things, one tiny nit below; and I +wonder whether just having the buffer say "No search results" (or +something similar) and leave the user to kill it would be nicer than +dinging (and more in line with the way search and tree behave). + +[In some sense I think this way is right and search and tree are wrong, +but that is probably difficult to get round as search and tree run +asynchronously.] + +Best wishes + +Mark + + +> --- +> 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..9a74848 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) +> + +> + ;; Cache the original tags for each message so that we can display +> + ;; changes. + +^^ I think "Store the original tags for each message" would be better, +particularly as this is nothing to do with the tag cache as used by say +notmuch-tag-clear-cache. + + +> + (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