(require 'mm-decode)
(require 'mailcap)
(require 'icalendar)
+(require 'goto-addr)
(require 'notmuch-lib)
(require 'notmuch-query)
:group 'notmuch
:type 'boolean)
-(defcustom notmuch-show-elide-same-subject nil
- "Do not show the subject of a collapsed message if it is the
-same as that of the previous message."
- :group 'notmuch
- :type 'boolean)
-
-(defcustom notmuch-show-always-show-subject t
- "Should a collapsed message show the `Subject:' line?"
- :group 'notmuch
- :type 'boolean)
-
(defvar notmuch-show-markup-headers-hook '(notmuch-show-colour-headers)
"A list of functions called to decorate the headers listed in
`notmuch-message-headers'.")
t)
(defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth declared-type)
- (let* ((message-part (plist-get part :content))
- (inner-parts (plist-get message-part :content)))
- (notmuch-show-insert-part-header nth declared-type content-type nil)
+ (notmuch-show-insert-part-header nth declared-type content-type nil)
+ (let* ((message (car (plist-get part :content)))
+ (headers (plist-get message :headers))
+ (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 part :headers)))
+ (notmuch-show-insert-headers (plist-get message :headers)))
+
;; Blank line after headers to be compatible with the normal
;; message display.
(insert "\n")
- ;; Show all of the parts.
- (mapc (lambda (inner-part)
- (notmuch-show-insert-bodypart msg inner-part depth))
- inner-parts))
+ ;; Show the body
+ (notmuch-show-insert-bodypart msg body depth)
+
+ (when notmuch-show-indent-multipart
+ (indent-rigidly start (point) 1)))
t)
(defun notmuch-show-insert-part-text/plain (msg part content-type nth depth declared-type)
;; 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 (and notmuch-show-elide-same-subject
- (not (string= notmuch-show-previous-subject
- bare-subject)))
+ (when (not (string= notmuch-show-previous-subject
+ bare-subject))
(forward-line 1))
(setq headers-start (point-marker)))
(setq headers-end (point-marker))
"Insert the forest of threads FOREST."
(mapc '(lambda (thread) (notmuch-show-insert-thread thread 0)) forest))
+(defvar notmuch-show-thread-id nil)
+(make-variable-buffer-local 'notmuch-show-thread-id)
(defvar notmuch-show-parent-buffer nil)
(make-variable-buffer-local 'notmuch-show-parent-buffer)
+(defvar notmuch-show-query-context nil)
+(make-variable-buffer-local 'notmuch-show-query-context)
+(defvar notmuch-show-buffer-name nil)
+(make-variable-buffer-local 'notmuch-show-buffer-name)
+
+(defun notmuch-show-buttonise-links (start end)
+ "Buttonise URLs and mail addresses between START and END.
+
+This also turns id:\"<message id>\"-parts into buttons for
+a corresponding notmuch search."
+ (goto-address-fontify-region start end)
+ (save-excursion
+ (goto-char start)
+ (while (re-search-forward "id:\\(\"?\\)[^[:space:]\"]+\\1" end t)
+ ;; remove the overlay created by goto-address-mode
+ (remove-overlays (match-beginning 0) (match-end 0) 'goto-address t)
+ (make-text-button (match-beginning 0) (match-end 0)
+ 'action `(lambda (arg)
+ (notmuch-search ,(match-string-no-properties 0)))
+ 'follow-link t
+ 'help-echo "Mouse-1, RET: search for this message"
+ 'face goto-address-mail-face))))
;;;###autoload
(defun notmuch-show (thread-id &optional parent-buffer query-context buffer-name crypto-switch)
messages from the thread matching this search term are shown if
non-nil.
-The optional BUFFER-NAME provides the neame of the buffer in
+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. "
(interactive "sNotmuch show: ")
- (let ((buffer (get-buffer-create (generate-new-buffer-name
- (or buffer-name
- (concat "*notmuch-" thread-id "*")))))
- (process-crypto (if crypto-switch
- (not notmuch-crypto-process-mime)
- notmuch-crypto-process-mime))
- (inhibit-read-only t))
+ (let* ((buffer-name (generate-new-buffer-name
+ (or buffer-name
+ (concat "*notmuch-" thread-id "*"))))
+ (buffer (get-buffer-create buffer-name))
+ (process-crypto (if crypto-switch
+ (not notmuch-crypto-process-mime)
+ notmuch-crypto-process-mime))
+ (inhibit-read-only t))
(switch-to-buffer buffer)
(notmuch-show-mode)
+
+ (setq notmuch-show-thread-id thread-id)
(setq notmuch-show-parent-buffer parent-buffer)
+ (setq notmuch-show-query-context query-context)
+ (setq notmuch-show-buffer-name buffer-name)
(setq notmuch-show-process-crypto process-crypto)
+
(erase-buffer)
(goto-char (point-min))
(save-excursion
(notmuch-show-insert-forest
(notmuch-query-get-threads basic-args))))
- ;; Enable buttonisation of URLs and email addresses in the
- ;; buffer.
- (goto-address-mode t)
+ (jit-lock-register #'notmuch-show-buttonise-links)
+
;; Act on visual lines rather than logical lines.
(visual-line-mode t)
(notmuch-show-mark-read)))
+(defun notmuch-show-refresh-view (&optional crypto-switch)
+ "Refresh the current view (with crypto switch if prefix given).
+
+Kills the current buffer and reruns notmuch show with the same
+thread id. If a prefix is given, the current thread is
+redisplayed with the crypto switch activated, which switch the
+logic of the notmuch-crypto-process-mime customization variable."
+ (interactive "P")
+ (let ((thread-id notmuch-show-thread-id)
+ (parent-buffer notmuch-show-parent-buffer)
+ (query-context notmuch-show-query-context)
+ (buffer-name notmuch-show-buffer-name))
+ (notmuch-kill-this-buffer)
+ (notmuch-show thread-id parent-buffer query-context buffer-name crypto-switch)))
+
(defvar notmuch-show-stash-map
(let ((map (make-sparse-keymap)))
(define-key map "c" 'notmuch-show-stash-cc)
(define-key map "V" 'notmuch-show-view-raw-message)
(define-key map "v" 'notmuch-show-view-all-mime-parts)
(define-key map "c" 'notmuch-show-stash-map)
+ (define-key map "=" 'notmuch-show-refresh-view)
(define-key map "h" 'notmuch-show-toggle-headers)
(define-key map "-" 'notmuch-show-remove-tag)
(define-key map "+" 'notmuch-show-add-tag)
without removing any tags, and '\\[notmuch-show-archive-thread]' to archive an entire thread
without scrolling through with \\[notmuch-show-advance-and-archive]).
-You can add or remove arbitary tags from the current message with
+You can add or remove arbitrary tags from the current message with
'\\[notmuch-show-add-tag]' or '\\[notmuch-show-remove-tag]'.
All currently available key bindings: