]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-show.el
emacs: avoid binding unnamed commands in keymaps
[notmuch] / emacs / notmuch-show.el
index 41f31c4653e3fed5c0b6a8351c4ecfa9e93ef26c..056c4e30abf0097435f6bd253ab7ec208a231a40 100644 (file)
@@ -1,4 +1,4 @@
-;;; notmuch-show.el --- displaying notmuch forests.
+;;; notmuch-show.el --- displaying notmuch forests
 ;;
 ;; Copyright © Carl Worth
 ;; Copyright © David Edmondson
 ;;
 ;; Copyright © Carl Worth
 ;; Copyright © David Edmondson
@@ -162,23 +162,17 @@ indentation."
   :type '(choice (const nil) regexp)
   :group 'notmuch-show)
 
   :type '(choice (const nil) regexp)
   :group 'notmuch-show)
 
-(defvar notmuch-show-thread-id nil)
-(make-variable-buffer-local 'notmuch-show-thread-id)
+(defvar-local notmuch-show-thread-id nil)
 
 
-(defvar notmuch-show-parent-buffer nil)
-(make-variable-buffer-local 'notmuch-show-parent-buffer)
+(defvar-local notmuch-show-parent-buffer nil)
 
 
-(defvar notmuch-show-query-context nil)
-(make-variable-buffer-local 'notmuch-show-query-context)
+(defvar-local notmuch-show-query-context nil)
 
 
-(defvar notmuch-show-process-crypto nil)
-(make-variable-buffer-local 'notmuch-show-process-crypto)
+(defvar-local notmuch-show-process-crypto nil)
 
 
-(defvar notmuch-show-elide-non-matching-messages nil)
-(make-variable-buffer-local 'notmuch-show-elide-non-matching-messages)
+(defvar-local notmuch-show-elide-non-matching-messages nil)
 
 
-(defvar notmuch-show-indent-content t)
-(make-variable-buffer-local 'notmuch-show-indent-content)
+(defvar-local notmuch-show-indent-content t)
 
 (defvar notmuch-show-attachment-debug nil
   "If t log stdout and stderr from attachment handlers.
 
 (defvar notmuch-show-attachment-debug nil
   "If t log stdout and stderr from attachment handlers.
@@ -186,8 +180,7 @@ indentation."
 When set to nil (the default) stdout and stderr from attachment
 handlers is discarded. When set to t the stdout and stderr from
 each attachment handler is logged in buffers with names beginning
 When set to nil (the default) stdout and stderr from attachment
 handlers is discarded. When set to t the stdout and stderr from
 each attachment handler is logged in buffers with names beginning
-\" *notmuch-part*\". This option requires emacs version at least
-24.3 to work.")
+\" *notmuch-part*\".")
 
 (defcustom notmuch-show-stash-mlarchive-link-alist
   '(("Gmane" . "https://mid.gmane.org/")
 
 (defcustom notmuch-show-stash-mlarchive-link-alist
   '(("Gmane" . "https://mid.gmane.org/")
@@ -272,7 +265,7 @@ position of the message in the thread."
   `(save-excursion
      (let ((id (notmuch-show-get-message-id)))
        (let ((buf (generate-new-buffer (concat "*notmuch-msg-" id "*"))))
   `(save-excursion
      (let ((id (notmuch-show-get-message-id)))
        (let ((buf (generate-new-buffer (concat "*notmuch-msg-" id "*"))))
-         (with-current-buffer buf
+        (with-current-buffer buf
           (let ((coding-system-for-read 'no-conversion))
             (call-process notmuch-command nil t nil "show" "--format=raw" id))
           ,@body)
           (let ((coding-system-for-read 'no-conversion))
             (call-process notmuch-command nil t nil "show" "--format=raw" id))
           ,@body)
@@ -297,13 +290,12 @@ position of the message in the thread."
    ;;
    ;; Any MIME part not explicitly mentioned here will be handled by an
    ;; external viewer as configured in the various mailcap files.
    ;;
    ;; Any MIME part not explicitly mentioned here will be handled by an
    ;; external viewer as configured in the various mailcap files.
-   (let ((mm-inline-media-tests '(
-                                 ("text/.*" ignore identity)
-                                 ("application/pgp-signature" ignore identity)
-                                 ("multipart/alternative" ignore identity)
-                                 ("multipart/mixed" ignore identity)
-                                 ("multipart/related" ignore identity)
-                                )))
+   (let ((mm-inline-media-tests
+         '(("text/.*" ignore identity)
+           ("application/pgp-signature" ignore identity)
+           ("multipart/alternative" ignore identity)
+           ("multipart/mixed" ignore identity)
+           ("multipart/related" ignore identity))))
      (mm-display-parts (mm-dissect-buffer)))))
 
 (defun notmuch-show-save-attachments ()
      (mm-display-parts (mm-dissect-buffer)))))
 
 (defun notmuch-show-save-attachments ()
@@ -320,7 +312,6 @@ position of the message in the thread."
 
 FN is called with one argument, the message properties. It should
 operation on the contents of the current buffer."
 
 FN is called with one argument, the message properties. It should
 operation on the contents of the current buffer."
-
   ;; Remake the header to ensure that all information is available.
   (let* ((to (notmuch-show-get-to))
         (cc (notmuch-show-get-cc))
   ;; Remake the header to ensure that all information is available.
   (let* ((to (notmuch-show-get-to))
         (cc (notmuch-show-get-cc))
@@ -329,7 +320,6 @@ operation on the contents of the current buffer."
         (date (notmuch-show-get-date))
         (tags (notmuch-show-get-tags))
         (depth (notmuch-show-get-depth))
         (date (notmuch-show-get-date))
         (tags (notmuch-show-get-tags))
         (depth (notmuch-show-get-depth))
-
         (header (concat
                  "Subject: " subject "\n"
                  "To: " to "\n"
         (header (concat
                  "Subject: " subject "\n"
                  "To: " to "\n"
@@ -349,10 +339,10 @@ operation on the contents of the current buffer."
         (indenting notmuch-show-indent-content))
     (with-temp-buffer
       (insert all)
         (indenting notmuch-show-indent-content))
     (with-temp-buffer
       (insert all)
-      (if indenting
-         (indent-rigidly (point-min)
-                         (point-max)
-                         (- (* notmuch-show-indent-messages-width depth))))
+      (when indenting
+       (indent-rigidly (point-min)
+                       (point-max)
+                       (- (* notmuch-show-indent-messages-width depth))))
       ;; Remove the original header.
       (goto-char (point-min))
       (re-search-forward "^$" (point-max) nil)
       ;; Remove the original header.
       (goto-char (point-min))
       (re-search-forward "^$" (point-max) nil)
@@ -375,7 +365,6 @@ operation on the contents of the current buffer."
                'message-header-subject)
               (t
                'message-header-other))))
                'message-header-subject)
               (t
                'message-header-other))))
-
     (overlay-put (make-overlay (point) (re-search-forward ":"))
                 'face 'message-header-name)
     (overlay-put (make-overlay (point) (re-search-forward ".*$"))
     (overlay-put (make-overlay (point) (re-search-forward ":"))
                 'face 'message-header-name)
     (overlay-put (make-overlay (point) (re-search-forward ".*$"))
@@ -396,70 +385,62 @@ operation on the contents of the current buffer."
   "Update the displayed tags of the current message."
   (save-excursion
     (goto-char (notmuch-show-message-top))
   "Update the displayed tags of the current message."
   (save-excursion
     (goto-char (notmuch-show-message-top))
-    (if (re-search-forward "(\\([^()]*\\))$" (line-end-position) t)
-       (let ((inhibit-read-only t))
-         (replace-match (concat "("
-                                (notmuch-tag-format-tags
-                                 tags
-                                 (notmuch-show-get-prop :orig-tags))
-                                ")"))))))
+    (when (re-search-forward "(\\([^()]*\\))$" (line-end-position) t)
+      (let ((inhibit-read-only t))
+       (replace-match (concat "("
+                              (notmuch-tag-format-tags
+                               tags
+                               (notmuch-show-get-prop :orig-tags))
+                              ")"))))))
 
 (defun notmuch-clean-address (address)
   "Try to clean a single email ADDRESS for display. Return a cons
 cell of (AUTHOR_EMAIL AUTHOR_NAME). Return (ADDRESS nil) if
 parsing fails."
   (condition-case nil
 
 (defun notmuch-clean-address (address)
   "Try to clean a single email ADDRESS for display. Return a cons
 cell of (AUTHOR_EMAIL AUTHOR_NAME). Return (ADDRESS nil) if
 parsing fails."
   (condition-case nil
-    (let (p-name p-address)
-      ;; It would be convenient to use `mail-header-parse-address',
-      ;; but that expects un-decoded mailbox parts, whereas our
-      ;; mailbox parts are already decoded (and hence may contain
-      ;; UTF-8). Given that notmuch should handle most of the awkward
-      ;; cases, some simple string deconstruction should be sufficient
-      ;; here.
-      (cond
-       ;; "User <user@dom.ain>" style.
-       ((string-match "\\(.*\\) <\\(.*\\)>" address)
-       (setq p-name (match-string 1 address)
-             p-address (match-string 2 address)))
-
-       ;; "<user@dom.ain>" style.
-       ((string-match "<\\(.*\\)>" address)
-       (setq p-address (match-string 1 address)))
-
-       ;; Everything else.
-       (t
-       (setq p-address address)))
-
-      (when p-name
-       ;; Remove elements of the mailbox part that are not relevant for
-       ;; display, even if they are required during transport:
-       ;;
-       ;; Backslashes.
-       (setq p-name (replace-regexp-in-string "\\\\" "" p-name))
-
-       ;; Outer single and double quotes, which might be nested.
-       (cl-loop with start-of-loop
-                do (setq start-of-loop p-name)
-
-                when (string-match "^\"\\(.*\\)\"$" p-name)
-                do (setq p-name (match-string 1 p-name))
-
-                when (string-match "^'\\(.*\\)'$" p-name)
-                do (setq p-name (match-string 1 p-name))
-
-                until (string= start-of-loop p-name)))
-
-      ;; If the address is 'foo@bar.com <foo@bar.com>' then show just
-      ;; 'foo@bar.com'.
-      (when (string= p-name p-address)
-       (setq p-name nil))
-
-      (cons p-address p-name))
+      (let (p-name p-address)
+       ;; It would be convenient to use `mail-header-parse-address',
+       ;; but that expects un-decoded mailbox parts, whereas our
+       ;; mailbox parts are already decoded (and hence may contain
+       ;; UTF-8). Given that notmuch should handle most of the awkward
+       ;; cases, some simple string deconstruction should be sufficient
+       ;; here.
+       (cond
+        ;; "User <user@dom.ain>" style.
+        ((string-match "\\(.*\\) <\\(.*\\)>" address)
+         (setq p-name (match-string 1 address))
+         (setq p-address (match-string 2 address)))
+
+        ;; "<user@dom.ain>" style.
+        ((string-match "<\\(.*\\)>" address)
+         (setq p-address (match-string 1 address)))
+        ;; Everything else.
+        (t
+         (setq p-address address)))
+       (when p-name
+         ;; Remove elements of the mailbox part that are not relevant for
+         ;; display, even if they are required during transport:
+         ;;
+         ;; Backslashes.
+         (setq p-name (replace-regexp-in-string "\\\\" "" p-name))
+         ;; Outer single and double quotes, which might be nested.
+         (cl-loop with start-of-loop
+                  do   (setq start-of-loop p-name)
+                  when (string-match "^\"\\(.*\\)\"$" p-name)
+                  do   (setq p-name (match-string 1 p-name))
+                  when (string-match "^'\\(.*\\)'$" p-name)
+                  do   (setq p-name (match-string 1 p-name))
+                  until (string= start-of-loop p-name)))
+       ;; If the address is 'foo@bar.com <foo@bar.com>' then show just
+       ;; 'foo@bar.com'.
+       (when (string= p-name p-address)
+         (setq p-name nil))
+       (cons p-address p-name))
     (error (cons address nil))))
 
 (defun notmuch-show-clean-address (address)
     (error (cons address nil))))
 
 (defun notmuch-show-clean-address (address)
-  "Try to clean a single email ADDRESS for display.  Return
-unchanged ADDRESS if parsing fails."
+  "Try to clean a single email ADDRESS for display.
+Return unchanged ADDRESS if parsing fails."
   (let* ((clean-address (notmuch-clean-address address))
         (p-address (car clean-address))
         (p-name (cdr clean-address)))
   (let* ((clean-address (notmuch-clean-address address))
         (p-address (car clean-address))
         (p-name (cdr clean-address)))
@@ -480,7 +461,10 @@ message at DEPTH in the current thread."
       ;; invisible U+200E LEFT-TO-RIGHT MARK character which forces
       ;; the header paragraph as left-to-right text.
       (insert (propertize (string ?\x200e) 'invisible t)))
       ;; invisible U+200E LEFT-TO-RIGHT MARK character which forces
       ;; the header paragraph as left-to-right text.
       (insert (propertize (string ?\x200e) 'invisible t)))
-    (insert (notmuch-show-spaces-n (* notmuch-show-indent-messages-width depth))
+    (insert (if notmuch-show-indent-content
+               (notmuch-show-spaces-n (* notmuch-show-indent-messages-width
+                                         depth))
+             "")
            from
            " ("
            date
            from
            " ("
            date
@@ -500,9 +484,9 @@ message at DEPTH in the current thread."
     (mapc (lambda (header)
            (let* ((header-symbol (intern (concat ":" header)))
                   (header-value (plist-get headers header-symbol)))
     (mapc (lambda (header)
            (let* ((header-symbol (intern (concat ":" header)))
                   (header-value (plist-get headers header-symbol)))
-             (if (and header-value
-                      (not (string-equal "" header-value)))
-                 (notmuch-show-insert-header header header-value))))
+             (when (and header-value
+                        (not (string-equal "" header-value)))
+               (notmuch-show-insert-header header header-value))))
          notmuch-message-headers)
     (save-excursion
       (save-restriction
          notmuch-message-headers)
     (save-excursion
       (save-restriction
@@ -517,22 +501,17 @@ message at DEPTH in the current thread."
 
 (defun notmuch-show-insert-part-header (nth content-type declared-type
                                            &optional name comment)
 
 (defun notmuch-show-insert-part-header (nth content-type declared-type
                                            &optional name comment)
-  (let ((button)
-       (base-label (concat (when name (concat name ": "))
+  (let ((base-label (concat (and name (concat name ": "))
                            declared-type
                            declared-type
-                           (unless (string-equal declared-type content-type)
-                             (concat " (as " content-type ")"))
+                           (and (not (string-equal declared-type content-type))
+                                (concat " (as " content-type ")"))
                            comment)))
                            comment)))
-
-    (setq button
-         (insert-button
-          (concat "[ " base-label " ]")
-          :base-label base-label
-          :type 'notmuch-show-part-button-type
-          :notmuch-part-hidden nil))
-    (insert "\n")
-    ;; return button
-    button))
+    (prog1 (insert-button
+           (concat "[ " base-label " ]")
+           :base-label base-label
+           :type 'notmuch-show-part-button-type
+           :notmuch-part-hidden nil)
+      (insert "\n"))))
 
 (defun notmuch-show-toggle-part-invisibility (&optional button)
   (interactive)
 
 (defun notmuch-show-toggle-part-invisibility (&optional button)
   (interactive)
@@ -588,12 +567,13 @@ message at DEPTH in the current thread."
       ;; alternative (even if we can't render it).
       (push (list content-id msg part) notmuch-show--cids)))
   ;; Recurse on sub-parts
       ;; alternative (even if we can't render it).
       (push (list content-id msg part) notmuch-show--cids)))
   ;; Recurse on sub-parts
-  (let ((ctype (notmuch-split-content-type
-               (downcase (plist-get part :content-type)))))
-    (cond ((equal (car ctype) "multipart")
+  (pcase-let ((`(,content ,type)
+              (split-string (downcase (plist-get part :content-type)) "/")))
+    (cond ((equal content "multipart")
           (mapc (apply-partially #'notmuch-show--register-cids msg)
                 (plist-get part :content)))
           (mapc (apply-partially #'notmuch-show--register-cids msg)
                 (plist-get part :content)))
-         ((equal ctype '("message" "rfc822"))
+         ((and (equal content "message")
+               (equal type "rfc822"))
           (notmuch-show--register-cids
            msg
            (car (plist-get (car (plist-get part :content)) :body)))))))
           (notmuch-show--register-cids
            msg
            (car (plist-get (car (plist-get part :content)) :body)))))))
@@ -619,10 +599,10 @@ will return nil if the CID is unknown or cannot be retrieved."
 (defun notmuch-show-setup-w3m ()
   "Instruct w3m how to retrieve content from a \"related\" part of a message."
   (interactive)
 (defun notmuch-show-setup-w3m ()
   "Instruct w3m how to retrieve content from a \"related\" part of a message."
   (interactive)
-  (if (boundp 'w3m-cid-retrieve-function-alist)
-    (unless (assq 'notmuch-show-mode w3m-cid-retrieve-function-alist)
-      (push (cons 'notmuch-show-mode #'notmuch-show--cid-w3m-retrieve)
-           w3m-cid-retrieve-function-alist)))
+  (when (and (boundp 'w3m-cid-retrieve-function-alist)
+            (not (assq 'notmuch-show-mode w3m-cid-retrieve-function-alist)))
+    (push (cons 'notmuch-show-mode #'notmuch-show--cid-w3m-retrieve)
+         w3m-cid-retrieve-function-alist))
   (setq mm-html-inhibit-images nil))
 
 (defvar w3m-current-buffer) ;; From `w3m.el'.
   (setq mm-html-inhibit-images nil))
 
 (defvar w3m-current-buffer) ;; From `w3m.el'.
@@ -652,8 +632,8 @@ will return nil if the CID is unknown or cannot be retrieved."
     ;; should be chosen if there are more than one that match?
     (mapc (lambda (inner-part)
            (let* ((inner-type (plist-get inner-part :content-type))
     ;; should be chosen if there are more than one that match?
     (mapc (lambda (inner-part)
            (let* ((inner-type (plist-get inner-part :content-type))
-                 (hide (not (or notmuch-show-all-multipart/alternative-parts
-                          (string= chosen-type inner-type)))))
+                  (hide (not (or notmuch-show-all-multipart/alternative-parts
+                                 (string= chosen-type inner-type)))))
              (notmuch-show-insert-bodypart msg inner-part depth hide)))
          inner-parts)
 
              (notmuch-show-insert-bodypart msg inner-part depth hide)))
          inner-parts)
 
@@ -664,14 +644,12 @@ will return nil if the CID is unknown or cannot be retrieved."
 (defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth button)
   (let ((inner-parts (plist-get part :content))
        (start (point)))
 (defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth button)
   (let ((inner-parts (plist-get part :content))
        (start (point)))
-
     ;; Render the primary part.  FIXME: Support RFC 2387 Start header.
     (notmuch-show-insert-bodypart msg (car inner-parts) depth)
     ;; Add hidden buttons for the rest
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth t))
          (cdr inner-parts))
     ;; Render the primary part.  FIXME: Support RFC 2387 Start header.
     (notmuch-show-insert-bodypart msg (car inner-parts) depth)
     ;; Add hidden buttons for the rest
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth t))
          (cdr inner-parts))
-
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
@@ -679,18 +657,15 @@ will return nil if the CID is unknown or cannot be retrieved."
 (defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth button)
   (when button
     (button-put button 'face 'notmuch-crypto-part-header))
 (defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth button)
   (when button
     (button-put button 'face 'notmuch-crypto-part-header))
-
   ;; Insert a button detailing the signature status.
   (notmuch-crypto-insert-sigstatus-button (car (plist-get part :sigstatus))
                                          (notmuch-show-get-header :From msg))
   ;; Insert a button detailing the signature status.
   (notmuch-crypto-insert-sigstatus-button (car (plist-get part :sigstatus))
                                          (notmuch-show-get-header :From msg))
-
   (let ((inner-parts (plist-get part :content))
        (start (point)))
     ;; Show all of the parts.
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
   (let ((inner-parts (plist-get part :content))
        (start (point)))
     ;; Show all of the parts.
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
-
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
@@ -698,21 +673,17 @@ will return nil if the CID is unknown or cannot be retrieved."
 (defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth button)
   (when button
     (button-put button 'face 'notmuch-crypto-part-header))
 (defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth button)
   (when button
     (button-put button 'face 'notmuch-crypto-part-header))
-
   ;; Insert a button detailing the encryption status.
   (notmuch-crypto-insert-encstatus-button (car (plist-get part :encstatus)))
   ;; Insert a button detailing the encryption status.
   (notmuch-crypto-insert-encstatus-button (car (plist-get part :encstatus)))
-
   ;; Insert a button detailing the signature status.
   (notmuch-crypto-insert-sigstatus-button (car (plist-get part :sigstatus))
                                          (notmuch-show-get-header :From msg))
   ;; Insert a button detailing the signature status.
   (notmuch-crypto-insert-sigstatus-button (car (plist-get part :sigstatus))
                                          (notmuch-show-get-header :From msg))
-
   (let ((inner-parts (plist-get part :content))
        (start (point)))
     ;; Show all of the parts.
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
   (let ((inner-parts (plist-get part :content))
        (start (point)))
     ;; Show all of the parts.
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
-
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
@@ -727,7 +698,6 @@ will return nil if the CID is unknown or cannot be retrieved."
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
     (mapc (lambda (inner-part)
            (notmuch-show-insert-bodypart msg inner-part depth))
          inner-parts)
-
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
@@ -736,19 +706,15 @@ will return nil if the CID is unknown or cannot be retrieved."
   (let* ((message (car (plist-get part :content)))
         (body (car (plist-get message :body)))
         (start (point)))
   (let* ((message (car (plist-get part :content)))
         (body (car (plist-get message :body)))
         (start (point)))
-
     ;; Override `notmuch-message-headers' to force `From' to be
     ;; displayed.
     (let ((notmuch-message-headers '("From" "Subject" "To" "Cc" "Date")))
       (notmuch-show-insert-headers (plist-get message :headers)))
     ;; Override `notmuch-message-headers' to force `From' to be
     ;; displayed.
     (let ((notmuch-message-headers '("From" "Subject" "To" "Cc" "Date")))
       (notmuch-show-insert-headers (plist-get message :headers)))
-
     ;; Blank line after headers to be compatible with the normal
     ;; message display.
     (insert "\n")
     ;; Blank line after headers to be compatible with the normal
     ;; message display.
     (insert "\n")
-
     ;; Show the body
     (notmuch-show-insert-bodypart msg body depth)
     ;; Show the body
     (notmuch-show-insert-bodypart msg body depth)
-
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
     (when notmuch-show-indent-multipart
       (indent-rigidly start (point) 1)))
   t)
@@ -794,45 +760,41 @@ will return nil if the CID is unknown or cannot be retrieved."
 (defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth button)
   (notmuch-show-insert-part-text/calendar msg part content-type nth depth button))
 
 (defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth button)
   (notmuch-show-insert-part-text/calendar msg part content-type nth depth button))
 
-(if (version< emacs-version "25.3")
-    ;; https://bugs.gnu.org/28350
-    ;;
-    ;; For newer emacs, we fall back to notmuch-show-insert-part-*/*
-    ;; (see notmuch-show-handlers-for)
-    (defun notmuch-show-insert-part-text/enriched
-       (msg part content-type nth depth button)
-      ;; By requiring enriched below, we ensure that the function
-      ;; enriched-decode-display-prop is defined before it will be
-      ;; shadowed by the letf below. Otherwise the version in
-      ;; enriched.el may be loaded a bit later and used instead (for
-      ;; the first time).
-      (require 'enriched)
-      (cl-letf (((symbol-function 'enriched-decode-display-prop)
-                (lambda (start end &optional param) (list start end))))
-       (notmuch-show-insert-part-*/* msg part content-type nth depth button))))
+(when (version< emacs-version "25.3")
+  ;; https://bugs.gnu.org/28350
+  ;;
+  ;; For newer emacs, we fall back to notmuch-show-insert-part-*/*
+  ;; (see notmuch-show-handlers-for)
+  (defun notmuch-show-insert-part-text/enriched
+      (msg part content-type nth depth button)
+    ;; By requiring enriched below, we ensure that the function
+    ;; enriched-decode-display-prop is defined before it will be
+    ;; shadowed by the letf below. Otherwise the version in
+    ;; enriched.el may be loaded a bit later and used instead (for
+    ;; the first time).
+    (require 'enriched)
+    (cl-letf (((symbol-function 'enriched-decode-display-prop)
+              (lambda (start end &optional param) (list start end))))
+      (notmuch-show-insert-part-*/* msg part content-type nth depth button))))
 
 (defun notmuch-show-get-mime-type-of-application/octet-stream (part)
   ;; If we can deduce a MIME type from the filename of the attachment,
   ;; we return that.
 
 (defun notmuch-show-get-mime-type-of-application/octet-stream (part)
   ;; If we can deduce a MIME type from the filename of the attachment,
   ;; we return that.
-  (if (plist-get part :filename)
-      (let ((extension (file-name-extension (plist-get part :filename)))
-           mime-type)
-       (if extension
-           (progn
-             (mailcap-parse-mimetypes)
-             (setq mime-type (mailcap-extension-to-mime extension))
-             (if (and mime-type
-                      (not (string-equal mime-type "application/octet-stream")))
-                 mime-type
-               nil))
-         nil))))
+  (and (plist-get part :filename)
+       (let ((extension (file-name-extension (plist-get part :filename))))
+        (and extension
+             (progn
+               (mailcap-parse-mimetypes)
+               (let ((mime-type (mailcap-extension-to-mime extension)))
+                 (and mime-type
+                      (not (string-equal mime-type "application/octet-stream"))
+                      mime-type)))))))
 
 (defun notmuch-show-insert-part-text/html (msg part content-type nth depth button)
   (if (eq mm-text-html-renderer 'shr)
       ;; It's easier to drive shr ourselves than to work around the
       ;; goofy things `mm-shr' does (like irreversibly taking over
       ;; content ID handling).
 
 (defun notmuch-show-insert-part-text/html (msg part content-type nth depth button)
   (if (eq mm-text-html-renderer 'shr)
       ;; It's easier to drive shr ourselves than to work around the
       ;; goofy things `mm-shr' does (like irreversibly taking over
       ;; content ID handling).
-
       ;; FIXME: If we block an image, offer a button to load external
       ;; images.
       (let ((shr-blocked-images notmuch-show-text/html-blocked-images))
       ;; FIXME: If we block an image, offer a button to load external
       ;; images.
       (let ((shr-blocked-images notmuch-show-text/html-blocked-images))
@@ -880,14 +842,13 @@ will return nil if the CID is unknown or cannot be retrieved."
   "Return a list of content handlers for a part of type CONTENT-TYPE."
   (let (result)
     (mapc (lambda (func)
   "Return a list of content handlers for a part of type CONTENT-TYPE."
   (let (result)
     (mapc (lambda (func)
-           (if (functionp func)
-               (push func result)))
+           (when (functionp func)
+             (push func result)))
          ;; Reverse order of prefrence.
          (list (intern (concat "notmuch-show-insert-part-*/*"))
          ;; Reverse order of prefrence.
          (list (intern (concat "notmuch-show-insert-part-*/*"))
-               (intern (concat
-                        "notmuch-show-insert-part-"
-                        (car (notmuch-split-content-type content-type))
-                        "/*"))
+               (intern (concat "notmuch-show-insert-part-"
+                               (car (split-string content-type "/"))
+                               "/*"))
                (intern (concat "notmuch-show-insert-part-" content-type))))
     result))
 
                (intern (concat "notmuch-show-insert-part-" content-type))))
     result))
 
@@ -908,7 +869,6 @@ will return nil if the CID is unknown or cannot be retrieved."
 
 (defun notmuch-show-create-part-overlays (button beg end)
   "Add an overlay to the part between BEG and END."
 
 (defun notmuch-show-create-part-overlays (button beg end)
   "Add an overlay to the part between BEG and END."
-
   ;; If there is no button (i.e., the part is text/plain and the first
   ;; part) or if the part has no content then we don't make the part
   ;; toggleable.
   ;; If there is no button (i.e., the part is text/plain and the first
   ;; part) or if the part has no content then we don't make the part
   ;; toggleable.
@@ -919,7 +879,6 @@ will return nil if the CID is unknown or cannot be retrieved."
 
 (defun notmuch-show-record-part-information (part beg end)
   "Store PART as a text property from BEG to END."
 
 (defun notmuch-show-record-part-information (part beg end)
   "Store PART as a text property from BEG to END."
-
   ;; Record part information.  Since we already inserted subparts,
   ;; don't override existing :notmuch-part properties.
   (notmuch-map-text-property beg end :notmuch-part
   ;; Record part information.  Since we already inserted subparts,
   ;; don't override existing :notmuch-part properties.
   (notmuch-map-text-property beg end :notmuch-part
@@ -1017,7 +976,6 @@ this part.")
 HIDE determines whether to show or hide the part and the button
 as follows: If HIDE is nil, show the part and the button. If HIDE
 is t, hide the part initially and show the button."
 HIDE determines whether to show or hide the part and the button
 as follows: If HIDE is nil, show the part and the button. If HIDE
 is t, hide the part initially and show the button."
-
   (let* ((content-type (downcase (plist-get part :content-type)))
         (mime-type (notmuch-show-mime-type part))
         (nth (plist-get part :id))
   (let* ((content-type (downcase (plist-get part :content-type)))
         (mime-type (notmuch-show-mime-type part))
         (nth (plist-get part :id))
@@ -1028,24 +986,22 @@ is t, hide the part initially and show the button."
         (beg (point))
         ;; This default header-p function omits the part button for
         ;; the first (or only) part if this is text/plain.
         (beg (point))
         ;; This default header-p function omits the part button for
         ;; the first (or only) part if this is text/plain.
-        (button (when (funcall notmuch-show-insert-header-p-function part hide)
-                  (notmuch-show-insert-part-header nth mime-type content-type
-                                                   (plist-get part :filename))))
+        (button (and (funcall notmuch-show-insert-header-p-function part hide)
+                     (notmuch-show-insert-part-header
+                      nth mime-type content-type
+                      (plist-get part :filename))))
         ;; Hide the part initially if HIDE is t, or if it is too long
         ;; and we have a button to allow toggling.
         (show-part (not (or (equal hide t)
                             (and long button))))
         (content-beg (point)))
         ;; Hide the part initially if HIDE is t, or if it is too long
         ;; and we have a button to allow toggling.
         (show-part (not (or (equal hide t)
                             (and long button))))
         (content-beg (point)))
-
     ;; Store the computed mime-type for later use (e.g. by attachment handlers).
     (plist-put part :computed-type mime-type)
     ;; Store the computed mime-type for later use (e.g. by attachment handlers).
     (plist-put part :computed-type mime-type)
-
     (if show-part
     (if show-part
-        (notmuch-show-insert-bodypart-internal msg part mime-type nth depth button)
+       (notmuch-show-insert-bodypart-internal msg part mime-type nth depth button)
       (when button
        (button-put button :notmuch-lazy-part
                    (list msg part mime-type nth depth button))))
       (when button
        (button-put button :notmuch-lazy-part
                    (list msg part mime-type nth depth button))))
-
     ;; Some of the body part handlers leave point somewhere up in the
     ;; part, so we make sure that we're down at the end.
     (goto-char (point-max))
     ;; Some of the body part handlers leave point somewhere up in the
     ;; part, so we make sure that we're down at the end.
     (goto-char (point-max))
@@ -1062,12 +1018,10 @@ is t, hide the part initially and show the button."
 
 (defun notmuch-show-insert-body (msg body depth)
   "Insert the body BODY at depth DEPTH in the current thread."
 
 (defun notmuch-show-insert-body (msg body depth)
   "Insert the body BODY at depth DEPTH in the current thread."
-
   ;; Register all content IDs for this message.  According to RFC
   ;; 2392, content IDs are *global*, but it's okay if an MUA treats
   ;; them as only global within a message.
   (notmuch-show--register-cids msg (car body))
   ;; Register all content IDs for this message.  According to RFC
   ;; 2392, content IDs are *global*, but it's okay if an MUA treats
   ;; them as only global within a message.
   (notmuch-show--register-cids msg (car body))
-
   (mapc (lambda (part) (notmuch-show-insert-bodypart msg part depth)) body))
 
 (defun notmuch-show-make-symbol (type)
   (mapc (lambda (part) (notmuch-show-insert-bodypart msg part depth)) body))
 
 (defun notmuch-show-make-symbol (type)
@@ -1088,18 +1042,13 @@ is t, hide the part initially and show the button."
         content-start content-end
         headers-start headers-end
         (bare-subject (notmuch-show-strip-re (plist-get headers :Subject))))
         content-start content-end
         headers-start headers-end
         (bare-subject (notmuch-show-strip-re (plist-get headers :Subject))))
-
     (setq message-start (point-marker))
     (setq message-start (point-marker))
-
     (notmuch-show-insert-headerline headers
     (notmuch-show-insert-headerline headers
-                                   (or (if notmuch-show-relative-dates
-                                           (plist-get msg :date_relative)
-                                         nil)
+                                   (or (and notmuch-show-relative-dates
+                                            (plist-get msg :date_relative))
                                        (plist-get headers :Date))
                                    (plist-get msg :tags) depth)
                                        (plist-get headers :Date))
                                    (plist-get msg :tags) depth)
-
     (setq content-start (point-marker))
     (setq content-start (point-marker))
-
     ;; Set `headers-start' to point after the 'Subject:' header to be
     ;; compatible with the existing implementation. This just sets it
     ;; to after the first header.
     ;; Set `headers-start' to point after the 'Subject:' header to be
     ;; compatible with the existing implementation. This just sets it
     ;; to after the first header.
@@ -1109,14 +1058,11 @@ is t, hide the part initially and show the button."
       ;; If the subject of this message is the same as that of the
       ;; previous message, don't display it when this message is
       ;; collapsed.
       ;; If the subject of this message is the same as that of the
       ;; previous message, don't display it when this message is
       ;; collapsed.
-      (when (not (string= notmuch-show-previous-subject
-                         bare-subject))
+      (unless (string= notmuch-show-previous-subject bare-subject)
        (forward-line 1))
       (setq headers-start (point-marker)))
     (setq headers-end (point-marker))
        (forward-line 1))
       (setq headers-start (point-marker)))
     (setq headers-end (point-marker))
-
     (setq notmuch-show-previous-subject bare-subject)
     (setq notmuch-show-previous-subject bare-subject)
-
     ;; A blank line between the headers and the body.
     (insert "\n")
     (notmuch-show-insert-body msg (plist-get msg :body)
     ;; A blank line between the headers and the body.
     (insert "\n")
     (notmuch-show-insert-body msg (plist-get msg :body)
@@ -1125,36 +1071,28 @@ is t, hide the part initially and show the button."
     (unless (bolp)
       (insert "\n"))
     (setq content-end (point-marker))
     (unless (bolp)
       (insert "\n"))
     (setq content-end (point-marker))
-
     ;; Indent according to the depth in the thread.
     ;; Indent according to the depth in the thread.
-    (if notmuch-show-indent-content
-       (indent-rigidly content-start
-                       content-end
-                       (* notmuch-show-indent-messages-width depth)))
-
+    (when notmuch-show-indent-content
+      (indent-rigidly content-start
+                     content-end
+                     (* notmuch-show-indent-messages-width depth)))
     (setq message-end (point-max-marker))
     (setq message-end (point-max-marker))
-
     ;; Save the extents of this message over the whole text of the
     ;; message.
     (put-text-property message-start message-end
                       :notmuch-message-extent
                       (cons message-start message-end))
     ;; Save the extents of this message over the whole text of the
     ;; message.
     (put-text-property message-start message-end
                       :notmuch-message-extent
                       (cons message-start message-end))
-
     ;; Create overlays used to control visibility
     (plist-put msg :headers-overlay (make-overlay headers-start headers-end))
     (plist-put msg :message-overlay (make-overlay headers-start content-end))
     ;; Create overlays used to control visibility
     (plist-put msg :headers-overlay (make-overlay headers-start headers-end))
     (plist-put msg :message-overlay (make-overlay headers-start content-end))
-
     (plist-put msg :depth depth)
     (plist-put msg :depth depth)
-
     ;; Save the properties for this message. Currently this saves the
     ;; entire message (augmented it with other stuff), which seems
     ;; like overkill. We might save a reduced subset (for example, not
     ;; the content).
     (notmuch-show-set-message-properties msg)
     ;; Save the properties for this message. Currently this saves the
     ;; entire message (augmented it with other stuff), which seems
     ;; like overkill. We might save a reduced subset (for example, not
     ;; the content).
     (notmuch-show-set-message-properties msg)
-
     ;; Set header visibility.
     (notmuch-show-headers-visible msg notmuch-message-headers-visible)
     ;; Set header visibility.
     (notmuch-show-headers-visible msg notmuch-message-headers-visible)
-
     ;; Message visibility depends on whether it matched the search
     ;; criteria.
     (notmuch-show-message-visible msg (and (plist-get msg :match)
     ;; Message visibility depends on whether it matched the search
     ;; criteria.
     (notmuch-show-message-visible msg (and (plist-get msg :match)
@@ -1299,38 +1237,33 @@ matched."
                    (eval (car (get 'mm-inline-override-types 'standard-value))))
             (cons "application/*" mm-inline-override-types)
           mm-inline-override-types)))
                    (eval (car (get 'mm-inline-override-types 'standard-value))))
             (cons "application/*" mm-inline-override-types)
           mm-inline-override-types)))
-    (switch-to-buffer (get-buffer-create buffer-name))
+    (pop-to-buffer-same-window (get-buffer-create buffer-name))
     ;; No need to track undo information for this buffer.
     (setq buffer-undo-list t)
     ;; No need to track undo information for this buffer.
     (setq buffer-undo-list t)
-
     (notmuch-show-mode)
     (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.
     ;; 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 (if (or (string= query-context "")
-                                            (string= query-context "*"))
-                                        nil query-context)
-
-         notmuch-show-process-crypto notmuch-crypto-process-mime
-         ;; If `elide-toggle', invert the default value.
-         notmuch-show-elide-non-matching-messages
+    (setq notmuch-show-thread-id thread-id)
+    (setq notmuch-show-parent-buffer parent-buffer)
+    (setq notmuch-show-query-context
+         (if (or (string= query-context "")
+                 (string= query-context "*"))
+             nil
+           query-context))
+    (setq notmuch-show-process-crypto notmuch-crypto-process-mime)
+    ;; If `elide-toggle', invert the default value.
+    (setq notmuch-show-elide-non-matching-messages
          (if elide-toggle
              (not notmuch-show-only-matching-messages)
            notmuch-show-only-matching-messages))
          (if elide-toggle
              (not notmuch-show-only-matching-messages)
            notmuch-show-only-matching-messages))
-
     (add-hook 'post-command-hook #'notmuch-show-command-hook nil t)
     (jit-lock-register #'notmuch-show-buttonise-links)
     (add-hook 'post-command-hook #'notmuch-show-command-hook nil t)
     (jit-lock-register #'notmuch-show-buttonise-links)
-
     (notmuch-tag-clear-cache)
     (notmuch-tag-clear-cache)
-
     (let ((inhibit-read-only t))
       (if (notmuch-show--build-buffer)
          ;; Messages were inserted into the buffer.
          (current-buffer)
     (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))
        ;; No messages were inserted - presumably none matched the
        ;; query.
        (kill-buffer (current-buffer))
@@ -1347,7 +1280,8 @@ and THREAD.  The next query is THREAD alone, and serves as a
 fallback if the prior matches no messages."
   (let (queries)
     (push (list thread) queries)
 fallback if the prior matches no messages."
   (let (queries)
     (push (list thread) queries)
-    (if context (push (list thread "and (" context ")") queries))
+    (when context
+      (push (list thread "and (" context ")") queries))
     queries))
 
 (defun notmuch-show--build-buffer (&optional state)
     queries))
 
 (defun notmuch-show--build-buffer (&optional state)
@@ -1358,8 +1292,8 @@ first relevant message.
 
 If no messages match the query return NIL."
   (let* ((cli-args (cons "--exclude=false"
 
 If no messages match the query return NIL."
   (let* ((cli-args (cons "--exclude=false"
-                        (when notmuch-show-elide-non-matching-messages
-                          (list "--entire-thread=false"))))
+                        (and notmuch-show-elide-non-matching-messages
+                             (list "--entire-thread=false"))))
         (queries (notmuch-show--build-queries
                   notmuch-show-thread-id notmuch-show-query-context))
         (forest nil)
         (queries (notmuch-show--build-queries
                   notmuch-show-thread-id notmuch-show-query-context))
         (forest nil)
@@ -1373,26 +1307,21 @@ If no messages match the query return NIL."
       (setq queries (cdr queries)))
     (when forest
       (notmuch-show-insert-forest forest)
       (setq queries (cdr queries)))
     (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))))
       ;; 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)))))
       ;; 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)))))
-
       (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)))
       (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))
 
     ;; Report back to the caller whether any messages matched.
     forest))
 
@@ -1437,14 +1366,12 @@ This includes:
  - moving to the correct current message in every displayed window."
   (let ((win-msg-alist (car state))
        (open (cadr state)))
  - moving to the correct current message in every displayed window."
   (let ((win-msg-alist (car state))
        (open (cadr state)))
-
     ;; Open those that were open.
     (goto-char (point-min))
     (cl-loop do (notmuch-show-message-visible
                 (notmuch-show-get-message-properties)
                 (member (notmuch-show-get-message-id) open))
             until (not (notmuch-show-goto-message-next)))
     ;; Open those that were open.
     (goto-char (point-min))
     (cl-loop do (notmuch-show-message-visible
                 (notmuch-show-get-message-properties)
                 (member (notmuch-show-get-message-id) open))
             until (not (notmuch-show-goto-message-next)))
-
     (dolist (win-msg-pair win-msg-alist)
       (with-selected-window (car win-msg-pair)
        ;; Go to the previously open message in this window
     (dolist (win-msg-pair win-msg-alist)
       (with-selected-window (car win-msg-pair)
        ;; Go to the previously open message in this window
@@ -1466,7 +1393,6 @@ reset based on the original query."
     ;; manually.
     (remove-overlays)
     (erase-buffer)
     ;; manually.
     (remove-overlays)
     (erase-buffer)
-
     (unless (notmuch-show--build-buffer state)
       ;; No messages were inserted.
       (kill-buffer (current-buffer))
     (unless (notmuch-show--build-buffer state)
       ;; No messages were inserted.
       (kill-buffer (current-buffer))
@@ -1552,7 +1478,6 @@ reset based on the original query."
     (define-key map "B" 'notmuch-show-browse-urls)
     map)
   "Keymap for \"notmuch show\" buffers.")
     (define-key map "B" 'notmuch-show-browse-urls)
     map)
   "Keymap for \"notmuch show\" buffers.")
-(fset 'notmuch-show-mode-map notmuch-show-mode-map)
 
 (define-derived-mode notmuch-show-mode fundamental-mode "notmuch-show"
   "Major mode for viewing a thread with notmuch.
 
 (define-derived-mode notmuch-show-mode fundamental-mode "notmuch-show"
   "Major mode for viewing a thread with notmuch.
@@ -1583,12 +1508,12 @@ All currently available key bindings:
 
 \\{notmuch-show-mode-map}"
   (setq notmuch-buffer-refresh-function #'notmuch-show-refresh-view)
 
 \\{notmuch-show-mode-map}"
   (setq notmuch-buffer-refresh-function #'notmuch-show-refresh-view)
-  (setq buffer-read-only t
-       truncate-lines t)
+  (setq buffer-read-only t)
+  (setq truncate-lines t)
   (setq imenu-prev-index-position-function
   (setq imenu-prev-index-position-function
-        #'notmuch-show-imenu-prev-index-position-function)
+       #'notmuch-show-imenu-prev-index-position-function)
   (setq imenu-extract-index-name-function
   (setq imenu-extract-index-name-function
-        #'notmuch-show-imenu-extract-index-name-function))
+       #'notmuch-show-imenu-extract-index-name-function))
 
 (defun notmuch-tree-from-show-current-query ()
   "Call notmuch tree with the current query."
 
 (defun notmuch-tree-from-show-current-query ()
   "Call notmuch tree with the current query."
@@ -1811,8 +1736,8 @@ We only mark it read once: if it is changed back then that is a
 user decision and we should not override it."
   (when (and (notmuch-show-message-visible-p)
             (not (notmuch-show-get-prop :seen)))
 user decision and we should not override it."
   (when (and (notmuch-show-message-visible-p)
             (not (notmuch-show-get-prop :seen)))
-       (notmuch-show-mark-read)
-       (notmuch-show-set-prop :seen t)))
+    (notmuch-show-mark-read)
+    (notmuch-show-set-prop :seen t)))
 
 (defvar notmuch-show--seen-has-errored nil)
 (make-variable-buffer-local 'notmuch-show--seen-has-errored)
 
 (defvar notmuch-show--seen-has-errored nil)
 (make-variable-buffer-local 'notmuch-show--seen-has-errored)
@@ -1826,7 +1751,7 @@ user decision and we should not override it."
          (funcall notmuch-show-mark-read-function (window-start) (window-end))
        ((debug error)
         (unless notmuch-show--seen-has-errored
          (funcall notmuch-show-mark-read-function (window-start) (window-end))
        ((debug error)
         (unless notmuch-show--seen-has-errored
-          (setq notmuch-show--seen-has-errored 't)
+          (setq notmuch-show--seen-has-errored t)
           (setq header-line-format
                 (concat header-line-format
                         (propertize
           (setq header-line-format
                 (concat header-line-format
                         (propertize
@@ -1852,13 +1777,11 @@ Reshows the current thread with matches defined by the new query-string."
     (let (message-ids done)
       (goto-char (point-min))
       (while (not done)
     (let (message-ids done)
       (goto-char (point-min))
       (while (not done)
-       (if (notmuch-show-message-visible-p)
-           (setq message-ids
-                 (append message-ids (list (notmuch-show-get-message-id)))))
-       (setq done (not (notmuch-show-goto-message-next)))
-       )
-      message-ids
-      )))
+       (when (notmuch-show-message-visible-p)
+         (setq message-ids
+               (append message-ids (list (notmuch-show-get-message-id)))))
+       (setq done (not (notmuch-show-goto-message-next))))
+      message-ids)))
 
 ;; Commands typically bound to keys.
 
 
 ;; Commands typically bound to keys.
 
@@ -1887,16 +1810,13 @@ current window), advance to the next open message."
           (> visible-end-of-this-message (window-end)))
       ;; The bottom of this message is not visible - scroll.
       (scroll-up nil))
           (> visible-end-of-this-message (window-end)))
       ;; The bottom of this message is not visible - scroll.
       (scroll-up nil))
-
      ((not (= end-of-this-message (point-max)))
       ;; This is not the last message - move to the next visible one.
       (notmuch-show-next-open-message))
      ((not (= end-of-this-message (point-max)))
       ;; This is not the last message - move to the next visible one.
       (notmuch-show-next-open-message))
-
      ((not (= (point) (point-max)))
       ;; This is the last message, but the cursor is not at the end of
       ;; the buffer. Move it there.
       (goto-char (point-max)))
      ((not (= (point) (point-max)))
       ;; This is the last message, but the cursor is not at the end of
       ;; the buffer. Move it there.
       (goto-char (point-max)))
-
      (t
       ;; This is the last message - change the return value
       (setq ret t)))
      (t
       ;; This is the last message - change the return value
       (setq ret t)))
@@ -1914,8 +1834,8 @@ archives the entire current thread, (apply changes in
 thread from the search from which this thread was originally
 shown."
   (interactive)
 thread from the search from which this thread was originally
 shown."
   (interactive)
-  (if (notmuch-show-advance)
-      (notmuch-show-archive-thread-then-next)))
+  (when (notmuch-show-advance)
+    (notmuch-show-archive-thread-then-next)))
 
 (defun notmuch-show-rewind ()
   "Backup through the thread (reverse scrolling compared to \
 
 (defun notmuch-show-rewind ()
   "Backup through the thread (reverse scrolling compared to \
@@ -1934,9 +1854,9 @@ any effects from previous calls to
   (let ((start-of-message (notmuch-show-message-top))
        (start-of-window (window-start)))
     (cond
   (let ((start-of-message (notmuch-show-message-top))
        (start-of-window (window-start)))
     (cond
-      ;; Either this message is properly aligned with the start of the
-      ;; window or the start of this message is not visible on the
-      ;; screen - scroll.
+     ;; Either this message is properly aligned with the start of the
+     ;; window or the start of this message is not visible on the
+     ;; screen - scroll.
      ((or (= start-of-message start-of-window)
          (< start-of-message start-of-window))
       (scroll-down)
      ((or (= start-of-message start-of-window)
          (< start-of-message start-of-window))
       (scroll-down)
@@ -2073,7 +1993,7 @@ to show, nil otherwise."
   (let* ((id (notmuch-show-get-message-id))
         (buf (get-buffer-create (concat "*notmuch-raw-" id "*")))
         (inhibit-read-only t))
   (let* ((id (notmuch-show-get-message-id))
         (buf (get-buffer-create (concat "*notmuch-raw-" id "*")))
         (inhibit-read-only t))
-    (switch-to-buffer buf)
+    (pop-to-buffer-same-window buf)
     (erase-buffer)
     (let ((coding-system-for-read 'no-conversion))
       (call-process notmuch-command nil t nil "show" "--format=raw" id))
     (erase-buffer)
     (let ((coding-system-for-read 'no-conversion))
       (call-process notmuch-command nil t nil "show" "--format=raw" id))
@@ -2132,7 +2052,7 @@ message."
          (set-buffer-modified-p nil)
          (setq buffer-read-only t)
          (unless (zerop exit-code)
          (set-buffer-modified-p nil)
          (setq buffer-read-only t)
          (unless (zerop exit-code)
-           (switch-to-buffer-other-window buf)
+           (pop-to-buffer buf)
            (message (format "Command '%s' exited abnormally with code %d"
                             shell-command exit-code))))))))
 
            (message (format "Command '%s' exited abnormally with code %d"
                             shell-command exit-code))))))))
 
@@ -2421,7 +2341,9 @@ the user (see `notmuch-show-stash-mlarchive-link-alist')."
   (browse-url (current-kill 0 t)))
 
 (defun notmuch-show-stash-git-helper (addresses prefix)
   (browse-url (current-kill 0 t)))
 
 (defun notmuch-show-stash-git-helper (addresses prefix)
-  "Escape, trim, quote, and add PREFIX to each address in list of ADDRESSES, and return the result as a single string."
+  "Normalize all ADDRESSES while adding PREFIX.
+Escape, trim, quote and add PREFIX to each address in list
+of ADDRESSES, and return the result as a single string."
   (mapconcat (lambda (x)
               (concat prefix "\""
                       ;; escape double-quotes
   (mapconcat (lambda (x)
               (concat prefix "\""
                       ;; escape double-quotes
@@ -2434,10 +2356,12 @@ the user (see `notmuch-show-stash-mlarchive-link-alist')."
             addresses " "))
 
 (put 'notmuch-show-stash-git-send-email 'notmuch-prefix-doc
             addresses " "))
 
 (put 'notmuch-show-stash-git-send-email 'notmuch-prefix-doc
-     "Copy From/To/Cc of current message to kill-ring in a form suitable for pasting to git send-email command line.")
+     "Copy From/To/Cc of current message to kill-ring.
+Use a form suitable for pasting to git send-email command line.")
 
 (defun notmuch-show-stash-git-send-email (&optional no-in-reply-to)
 
 (defun notmuch-show-stash-git-send-email (&optional no-in-reply-to)
-  "Copy From/To/Cc/Message-Id of current message to kill-ring in a form suitable for pasting to git send-email command line.
+  "Copy From/To/Cc/Message-Id of current message to kill-ring.
+Use a form suitable for pasting to git send-email command line.
 
 If invoked with a prefix argument (or NO-IN-REPLY-TO is non-nil),
 omit --in-reply-to=<Message-Id>."
 
 If invoked with a prefix argument (or NO-IN-REPLY-TO is non-nil),
 omit --in-reply-to=<Message-Id>."
@@ -2480,7 +2404,7 @@ MIME-TYPE is given then set the handle's mime-type to MIME-TYPE."
         (buf (notmuch-show-generate-part-buffer msg part))
         (computed-type (or mime-type (plist-get part :computed-type)))
         (filename (plist-get part :filename))
         (buf (notmuch-show-generate-part-buffer msg part))
         (computed-type (or mime-type (plist-get part :computed-type)))
         (filename (plist-get part :filename))
-        (disposition (if filename `(attachment (filename . ,filename)))))
+        (disposition (and filename `(attachment (filename . ,filename)))))
     (mm-make-handle buf (list computed-type) nil nil disposition)))
 
 (defun notmuch-show-apply-to-current-part-handle (fn &optional mime-type)
     (mm-make-handle buf (list computed-type) nil nil disposition)))
 
 (defun notmuch-show-apply-to-current-part-handle (fn &optional mime-type)
@@ -2490,10 +2414,9 @@ This ensures that the temporary buffer created for the mm-handle
 is destroyed when FN returns. If MIME-TYPE is given then force
 part to be treated as if it had that mime-type."
   (let ((handle (notmuch-show-current-part-handle mime-type)))
 is destroyed when FN returns. If MIME-TYPE is given then force
 part to be treated as if it had that mime-type."
   (let ((handle (notmuch-show-current-part-handle mime-type)))
-    ;; emacs 24.3+ puts stdout/stderr into the calling buffer so we
-    ;; call it from a temp-buffer, unless
-    ;; notmuch-show-attachment-debug is non-nil in which case we put
-    ;; it in " *notmuch-part*".
+    ;; Emacs puts stdout/stderr into the calling buffer so we call
+    ;; it from a temp-buffer, unless notmuch-show-attachment-debug
+    ;; is non-nil, in which case we put it in " *notmuch-part*".
     (unwind-protect
        (if notmuch-show-attachment-debug
            (with-current-buffer (generate-new-buffer " *notmuch-part*")
     (unwind-protect
        (if notmuch-show-attachment-debug
            (with-current-buffer (generate-new-buffer " *notmuch-part*")
@@ -2533,7 +2456,6 @@ part to be treated as if it had that mime-type."
   (interactive)
   (notmuch-show-apply-to-current-part-handle #'mm-pipe-part))
 
   (interactive)
   (notmuch-show-apply-to-current-part-handle #'mm-pipe-part))
 
-
 (defun notmuch-show--mm-display-part (handle)
   "Use mm-display-part to display HANDLE in a new buffer.
 
 (defun notmuch-show--mm-display-part (handle)
   "Use mm-display-part to display HANDLE in a new buffer.
 
@@ -2541,7 +2463,7 @@ If the part is displayed in an external application then close
 the new buffer."
   (let ((buf (get-buffer-create (generate-new-buffer-name
                                 (concat " *notmuch-internal-part*")))))
 the new buffer."
   (let ((buf (get-buffer-create (generate-new-buffer-name
                                 (concat " *notmuch-internal-part*")))))
-    (switch-to-buffer buf)
+    (pop-to-buffer-same-window buf)
     (if (eq (mm-display-part handle) 'external)
        (kill-buffer buf)
       (goto-char (point-min))
     (if (eq (mm-display-part handle) 'external)
        (kill-buffer buf)
       (goto-char (point-min))
@@ -2581,9 +2503,9 @@ beginning of the line."
 message."
   `(save-excursion
      (save-restriction
 message."
   `(save-excursion
      (save-restriction
-      (let ((extent (notmuch-show-message-extent)))
-       (narrow-to-region (car extent) (cdr extent))
-       ,@body))))
+       (let ((extent (notmuch-show-message-extent)))
+        (narrow-to-region (car extent) (cdr extent))
+        ,@body))))
 
 (defun notmuch-show--gather-urls ()
   "Gather any URLs in the current message."
 
 (defun notmuch-show--gather-urls ()
   "Gather any URLs in the current message."