From: David Edmondson Date: Wed, 10 Feb 2016 14:01:18 +0000 (+0000) Subject: [PATCH v2] emacs: Report a lack of matches when calling `notmuch-show'. X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=78e5191f8eec84198b92ab491b944a010c1cacc7;p=notmuch-archives.git [PATCH v2] emacs: Report a lack of matches when calling `notmuch-show'. --- diff --git a/58/c01e243c8b277409334b74592e6a6dd6c9f70d b/58/c01e243c8b277409334b74592e6a6dd6c9f70d new file mode 100644 index 000000000..f6ca0ae84 --- /dev/null +++ b/58/c01e243c8b277409334b74592e6a6dd6c9f70d @@ -0,0 +1,316 @@ +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 8F6FC6DE021E + for ; Wed, 10 Feb 2016 06:01:27 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.11 +X-Spam-Level: +X-Spam-Status: No, score=-0.11 tagged_above=-999 required=5 tests=[AWL=-0.043, + DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_LOW=-0.7, + RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_NEUTRAL=0.652, + UNPARSEABLE_RELAY=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 l8PkmZ4X1Lqc for ; + Wed, 10 Feb 2016 06:01:25 -0800 (PST) +Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com + [74.125.82.67]) by arlo.cworth.org (Postfix) with ESMTPS id 9CFC56DE0231 for + ; Wed, 10 Feb 2016 06:01:24 -0800 (PST) +Received: by mail-wm0-f67.google.com with SMTP id 128so4392155wmz.3 + for ; Wed, 10 Feb 2016 06:01:24 -0800 (PST) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=dme-org.20150623.gappssmtp.com; s=20150623; + h=from:to:subject:date:message-id:in-reply-to:references; + bh=da2qfbL+IpdGWd06Y5DgspunHc2t5V4ThIoO+KG8aH8=; + b=HYjjaDOt54QN2A5e1d3b6WWnmo+OXCAmdyuhNR1r1MsiujySX5B0wpypTUCMDrnf42 + NWRmFE6Xw6KauGQmUHtVu95axiX9DlctJI7Bg0kFzGGGJCqYECdZ2R3PuwX62eacTPb/ + p0BzhOXxo7TuwfOjIbSvU6JBZSGevWjah2xPW1P8fBREtz53Wuh2qtscz1vsZ6B80z4E + Z/H/HpRhGbqKN7urzegN0yhht9e4+m5gDzlJVeHo5R/wecHuLVYCa1gfN7hlFZqCpyXs + eVXN9yxm8yOU20eUFi42z2CNVtsfnYB+I7djNYB4kKRsbcvWXoKa8paZOPnY8ccU4iic + rvew== +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:date:message-id:in-reply-to + :references; + bh=da2qfbL+IpdGWd06Y5DgspunHc2t5V4ThIoO+KG8aH8=; + b=NKxqOxJnFllssCzcyizgmwiZ7v4sdUvbE+bbO4zntRDxmKxhj9J7b3Fs5QjMqmYMbf + xAKf+autwkUc8ut8CYoUOMOaovdWiSJ4glkJhO9yo/5/RR0CEyGy16zLwwDfaBUy6/a3 + k34SMAtoqGikIyQNOHIhUMNhIsV0/QHio8D380ELki5/WVjlQSlhSHfKOPPRZ89cCs+C + s+q6zpXU/IabnwFlA4tVOd03n9MOt9+IKEzpHdeQc5lwtvWeN1pu0RWdr6EzUuKadrM/ + 6RjtqUxp+IlogD39DjtfcpRS5MKLBmP01xMQlz7kNOpr6thc6gVckRTGEVIOaGtuTg2t + 7FRw== +X-Gm-Message-State: + AG10YOQ7RFAavnnHZHNkgX6FiHjrZspHuyQVKsw3aSuR0+gfTk9VYXjsHYjVChF0CJy/9A== +X-Received: by 10.28.23.5 with SMTP id 5mr11584073wmx.82.1455112883180; + Wed, 10 Feb 2016 06:01:23 -0800 (PST) +Received: from disaster-area.hh.sledj.net + ([2a01:348:1a2:1:ea39:35ff:fe2c:a227]) + by smtp.gmail.com with ESMTPSA id 75sm22566226wmo.22.2016.02.10.06.01.21 + for + (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Wed, 10 Feb 2016 06:01:22 -0800 (PST) +Received: from localhost (disaster-area.hh.sledj.net [local]) + by disaster-area.hh.sledj.net (OpenSMTPD) with ESMTPA id 3b0aaf6f + for ; Wed, 10 Feb 2016 14:01:18 +0000 (UTC) +From: David Edmondson +To: notmuch@notmuchmail.org +Subject: [PATCH v2] emacs: Report a lack of matches when calling + `notmuch-show'. +Date: Wed, 10 Feb 2016 14:01:18 +0000 +Message-Id: <1455112878-23497-2-git-send-email-dme@dme.org> +X-Mailer: git-send-email 2.1.4 +In-Reply-To: <1455112878-23497-1-git-send-email-dme@dme.org> +References: <1455112878-23497-1-git-send-email-dme@dme.org> +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 14:01:27 -0000 + +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..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. ++ (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 +