(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-search-next-thread "notmuch" nil)
+(declare-function notmuch-search-previous-thread "notmuch" nil)
(declare-function notmuch-search-show-thread "notmuch" nil)
(defcustom notmuch-message-headers '("Subject" "To" "Cc" "Date")
(defun notmuch-show-view-part (message-id nth &optional filename content-type )
(notmuch-with-temp-part-buffer message-id nth
- ;; set mm-inlined-types to nil to force an external viewer
- (let ((handle (mm-make-handle (current-buffer) (list content-type)))
- (mm-inlined-types nil))
- ;; We override mm-save-part as notmuch-show-save-part is better
- ;; since it offers the filename. We need to lexically bind
- ;; everything we need for notmuch-show-save-part to prevent
- ;; potential dynamic shadowing.
- (lexical-let ((message-id message-id)
- (nth nth)
- (filename filename)
- (content-type content-type))
- (flet ((mm-save-part (&rest args) (notmuch-show-save-part
- message-id nth filename content-type)))
- (mm-display-part handle))))))
+ (let* ((disposition (if filename `(attachment (filename . ,filename))))
+ (handle (mm-make-handle (current-buffer) (list content-type)
+ nil nil disposition))
+ ;; Set the default save directory to be consistent with
+ ;; `notmuch-show-save-part'.
+ (mm-default-directory (or mailcap-download-directory "~/"))
+ ;; set mm-inlined-types to nil to force an external viewer
+ (mm-inlined-types nil))
+ (mm-display-part handle))))
(defun notmuch-show-interactively-view-part (message-id nth &optional filename content-type)
(notmuch-with-temp-part-buffer message-id nth
(new-start (button-start button))
(button-label (button-get button :base-label))
(old-point (point))
+ (properties (text-properties-at (point)))
(inhibit-read-only t))
(overlay-put overlay 'invisible (not show))
(goto-char new-start)
(insert "[ " button-label (if show " ]" " (hidden) ]"))
+ (set-text-properties new-start (point) properties)
(let ((old-end (button-end button)))
(move-overlay button new-start (point))
(delete-region (point) old-end))
(define-key map "P" 'notmuch-show-previous-message)
(define-key map "n" 'notmuch-show-next-open-message)
(define-key map "p" 'notmuch-show-previous-open-message)
+ (define-key map (kbd "M-n") 'notmuch-show-next-thread-show)
+ (define-key map (kbd "M-p") 'notmuch-show-previous-thread-show)
(define-key map (kbd "DEL") 'notmuch-show-rewind)
(define-key map " " 'notmuch-show-advance-and-archive)
(define-key map (kbd "M-RET") 'notmuch-show-open-or-close-all)
(interactive)
(backward-button 1))
-(defun notmuch-show-next-thread (&optional show-next)
- "Move to the next item in the search results, if any."
+(defun notmuch-show-next-thread (&optional show previous)
+ "Move to the next item in the search results, if any.
+
+If SHOW is non-nil, open the next item in a show
+buffer. Otherwise just highlight the next item in the search
+buffer. If PREVIOUS is non-nil, move to the previous item in the
+search results instead."
(interactive "P")
(let ((parent-buffer notmuch-show-parent-buffer))
(notmuch-kill-this-buffer)
(when (buffer-live-p parent-buffer)
(switch-to-buffer parent-buffer)
- (notmuch-search-next-thread)
- (if show-next
- (notmuch-search-show-thread)))))
+ (and (if previous
+ (notmuch-search-previous-thread)
+ (notmuch-search-next-thread))
+ show
+ (notmuch-search-show-thread)))))
+
+(defun notmuch-show-next-thread-show ()
+ "Show the next thread in the search results, if any."
+ (interactive)
+ (notmuch-show-next-thread t))
+
+(defun notmuch-show-previous-thread-show ()
+ "Show the previous thread in the search results, if any."
+ (interactive)
+ (notmuch-show-next-thread t t))
(defun notmuch-show-archive-thread (&optional unarchive)
"Archive each message in thread.