* [PATCH v3] (notmuch-show "id:doesnotexist") should not throw an error. @ 2016-02-11 8:33 David Edmondson 2016-02-11 8:33 ` [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show' David Edmondson 0 siblings, 1 reply; 5+ messages in thread From: David Edmondson @ 2016-02-11 8:33 UTC (permalink / raw) To: notmuch (notmuch-show "id:doesnotexist") should not throw an error. This is a followup to id:"874nw0ltwz.fsf@praet.org" and id:"cuntx91fwaa.fsf@hotblack-desiato.hh.sledj.net". The originally proposed change (to have id: links call `notmuch-show' rather than `notmuch-search') was already made, but the difficulties with links that generated no results was not addressed. This patch aims to do that. v2: - Re-worked to `ding' rather than throwing an error. - Re-jig the relationship between `notmuch-show', `notmuch-show-refresh-view' and `notmuch-show--build-buffer'. - Various buffer local variables no longer need to be `permanent-local'. v3: - Comment re-wording. David Edmondson (1): emacs: Report a lack of matches when calling `notmuch-show'. emacs/notmuch-show.el | 144 +++++++++++++++++++++++++++++--------------------- emacs/notmuch.el | 6 ++- 2 files changed, 89 insertions(+), 61 deletions(-) -- 2.1.4 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show'. 2016-02-11 8:33 [PATCH v3] (notmuch-show "id:doesnotexist") should not throw an error David Edmondson @ 2016-02-11 8:33 ` David Edmondson 2016-02-12 17:14 ` Tomi Ollila ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: David Edmondson @ 2016-02-11 8:33 UTC (permalink / raw) To: notmuch 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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show'. 2016-02-11 8:33 ` [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show' David Edmondson @ 2016-02-12 17:14 ` Tomi Ollila 2016-02-14 21:29 ` Mark Walters 2016-02-20 13:23 ` David Bremner 2 siblings, 0 replies; 5+ messages in thread From: Tomi Ollila @ 2016-02-12 17:14 UTC (permalink / raw) To: David Edmondson, notmuch On Thu, Feb 11 2016, David Edmondson <dme@dme.org> 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. Looks good (the parts I understood) and works fine (testing with devel/try-emacs-mua). FYI: when testing with (eval-last-sexp) interactively (c-x c-e) message does not appear in minibuffer -- since the following 'nil' will take its place -- the msg is in *Messages* buffer Tomi > > 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(-) > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show'. 2016-02-11 8:33 ` [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show' David Edmondson 2016-02-12 17:14 ` Tomi Ollila @ 2016-02-14 21:29 ` Mark Walters 2016-02-20 13:23 ` David Bremner 2 siblings, 0 replies; 5+ messages in thread From: Mark Walters @ 2016-02-14 21:29 UTC (permalink / raw) To: David Edmondson, notmuch Just to confirm that this LGTM +1. Best wishes Mark On Thu, 11 Feb 2016, David Edmondson <dme@dme.org> 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show'. 2016-02-11 8:33 ` [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show' David Edmondson 2016-02-12 17:14 ` Tomi Ollila 2016-02-14 21:29 ` Mark Walters @ 2016-02-20 13:23 ` David Bremner 2 siblings, 0 replies; 5+ messages in thread From: David Bremner @ 2016-02-20 13:23 UTC (permalink / raw) To: David Edmondson, notmuch David Edmondson <dme@dme.org> writes: > 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. pushed. d ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-02-20 13:23 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-02-11 8:33 [PATCH v3] (notmuch-show "id:doesnotexist") should not throw an error David Edmondson 2016-02-11 8:33 ` [PATCH v3] emacs: Report a lack of matches when calling `notmuch-show' David Edmondson 2016-02-12 17:14 ` Tomi Ollila 2016-02-14 21:29 ` Mark Walters 2016-02-20 13:23 ` David Bremner
Code repositories for project(s) associated with this public inbox https://yhetil.org/notmuch.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).