mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 20:08:10 +01:00
Make bodies locally toggleable
Having actually implemented this, I realized that my initial approach of providing a function to configure a button was wrong. Instead I've replaced that with button types. This then makes it possible to provide the fully expanded view when all threads in a message are unread. It also has the potential to allow global-expansion functions if that is desireable
This commit is contained in:
parent
9eb90688b7
commit
daeda152b8
1 changed files with 47 additions and 42 deletions
87
notmuch.el
87
notmuch.el
|
@ -497,12 +497,15 @@ which this thread was originally shown."
|
||||||
(force-window-update)
|
(force-window-update)
|
||||||
(redisplay t))
|
(redisplay t))
|
||||||
|
|
||||||
(defun notmuch-configure-invisibility-button (btn invis-spec help-msg)
|
(define-button-type 'notmuch-button-invisibility-toggle-type 'action 'notmuch-toggle-invisible-action 'follow-link t)
|
||||||
(button-put btn 'invisibility-spec invis-spec)
|
(define-button-type 'notmuch-button-citation-toggle-type 'help-echo "mouse-1, RET: Show citation"
|
||||||
(button-put btn 'action 'notmuch-toggle-invisible-action)
|
:supertype 'notmuch-button-invisibility-toggle-type)
|
||||||
(button-put btn 'follow-link t)
|
(define-button-type 'notmuch-button-signature-toggle-type 'help-echo "mouse-1, RET: Show signature"
|
||||||
(button-put btn 'help-echo (concat "mouse-1, RET: " help-msg))
|
:supertype 'notmuch-button-invisibility-toggle-type)
|
||||||
)
|
(define-button-type 'notmuch-button-headers-toggle-type 'help-echo "mouse-1, RET: Show headers"
|
||||||
|
:supertype 'notmuch-button-invisibility-toggle-type)
|
||||||
|
(define-button-type 'notmuch-button-body-toggle-type 'help-echo "mouse-1, RET: Show message"
|
||||||
|
:supertype 'notmuch-button-invisibility-toggle-type)
|
||||||
|
|
||||||
(defun notmuch-show-markup-citations-region (beg end depth)
|
(defun notmuch-show-markup-citations-region (beg end depth)
|
||||||
(goto-char beg)
|
(goto-char beg)
|
||||||
|
@ -525,7 +528,9 @@ which this thread was originally shown."
|
||||||
"-line citation.]")))
|
"-line citation.]")))
|
||||||
(goto-char (- beg-sub 1))
|
(goto-char (- beg-sub 1))
|
||||||
(insert (concat "\n" indent))
|
(insert (concat "\n" indent))
|
||||||
(notmuch-configure-invisibility-button (insert-button cite-button-text) invis-spec "Show citation")
|
(insert-button cite-button-text
|
||||||
|
'invisibility-spec invis-spec
|
||||||
|
:type 'notmuch-button-citation-toggle-type)
|
||||||
(insert "\n")
|
(insert "\n")
|
||||||
(goto-char (+ (length cite-button-text) p))
|
(goto-char (+ (length cite-button-text) p))
|
||||||
))))
|
))))
|
||||||
|
@ -541,9 +546,11 @@ which this thread was originally shown."
|
||||||
|
|
||||||
(goto-char (- beg-sub 1))
|
(goto-char (- beg-sub 1))
|
||||||
(insert (concat "\n" indent))
|
(insert (concat "\n" indent))
|
||||||
(notmuch-configure-invisibility-button
|
(let ((sig-button-text (concat "[" (number-to-string sig-lines)
|
||||||
(insert-button (concat "[" (number-to-string sig-lines)
|
"-line signature.]")))
|
||||||
"-line signature.]")) invis-spec "Show signature")
|
(insert-button sig-button-text 'invisibility-spec invis-spec
|
||||||
|
:type 'notmuch-button-signature-toggle-type)
|
||||||
|
)
|
||||||
(insert "\n")
|
(insert "\n")
|
||||||
(goto-char end))))))
|
(goto-char end))))))
|
||||||
(forward-line))))
|
(forward-line))))
|
||||||
|
@ -572,16 +579,19 @@ which this thread was originally shown."
|
||||||
(while (< (point) end)
|
(while (< (point) end)
|
||||||
(notmuch-show-markup-part beg end depth))))
|
(notmuch-show-markup-part beg end depth))))
|
||||||
|
|
||||||
(defun notmuch-show-markup-body (depth)
|
(defun notmuch-show-markup-body (depth btn)
|
||||||
(re-search-forward notmuch-show-body-begin-regexp)
|
(re-search-forward notmuch-show-body-begin-regexp)
|
||||||
(forward-line)
|
(forward-line)
|
||||||
(let ((beg (point-marker)))
|
(let ((beg (point-marker)))
|
||||||
(re-search-forward notmuch-show-body-end-regexp)
|
(re-search-forward notmuch-show-body-end-regexp)
|
||||||
(let ((end (copy-marker (match-beginning 0))))
|
(let ((end (copy-marker (match-beginning 0))))
|
||||||
(notmuch-show-markup-parts-region beg end depth)
|
(notmuch-show-markup-parts-region beg end depth)
|
||||||
(if (not (notmuch-show-message-unread-p))
|
(let ((invis-spec (make-symbol "notmuch-show-body-read")))
|
||||||
(overlay-put (make-overlay beg end)
|
(overlay-put (make-overlay beg end)
|
||||||
'invisible 'notmuch-show-body-read))
|
'invisible invis-spec)
|
||||||
|
(button-put btn 'invisibility-spec invis-spec)
|
||||||
|
(if (not (notmuch-show-message-unread-p))
|
||||||
|
(add-to-invisibility-spec invis-spec)))
|
||||||
(set-marker beg nil)
|
(set-marker beg nil)
|
||||||
(set-marker end nil)
|
(set-marker end nil)
|
||||||
)))
|
)))
|
||||||
|
@ -589,10 +599,12 @@ which this thread was originally shown."
|
||||||
(defun notmuch-show-markup-header (depth)
|
(defun notmuch-show-markup-header (depth)
|
||||||
(re-search-forward notmuch-show-header-begin-regexp)
|
(re-search-forward notmuch-show-header-begin-regexp)
|
||||||
(forward-line)
|
(forward-line)
|
||||||
(let ((beg (point-marker)))
|
(let ((beg (point-marker))
|
||||||
|
(btn nil))
|
||||||
(end-of-line)
|
(end-of-line)
|
||||||
; Inverse video for subject
|
; Inverse video for subject
|
||||||
(overlay-put (make-overlay beg (point)) 'face '(:inverse-video t))
|
(overlay-put (make-overlay beg (point)) 'face '(:inverse-video t))
|
||||||
|
(setq btn (make-button beg (point) :type 'notmuch-button-body-toggle-type))
|
||||||
(forward-line 1)
|
(forward-line 1)
|
||||||
(end-of-line)
|
(end-of-line)
|
||||||
(let ((beg-hidden (point-marker)))
|
(let ((beg-hidden (point-marker)))
|
||||||
|
@ -614,23 +626,25 @@ which this thread was originally shown."
|
||||||
'invisible invis-spec)
|
'invisible invis-spec)
|
||||||
(goto-char beg)
|
(goto-char beg)
|
||||||
(forward-line)
|
(forward-line)
|
||||||
(notmuch-configure-invisibility-button
|
(make-button (line-beginning-position) (line-end-position)
|
||||||
(make-button (line-beginning-position) (line-end-position))
|
'invisibility-spec (cons invis-spec t)
|
||||||
(cons invis-spec t) "Show headers"))
|
:type 'notmuch-button-headers-toggle-type))
|
||||||
(goto-char end)
|
(goto-char end)
|
||||||
(insert "\n")
|
(insert "\n")
|
||||||
(set-marker beg nil)
|
(set-marker beg nil)
|
||||||
(set-marker beg-hidden nil)
|
(set-marker beg-hidden nil)
|
||||||
(set-marker end nil)
|
(set-marker end nil)
|
||||||
))))
|
))
|
||||||
|
btn))
|
||||||
|
|
||||||
(defun notmuch-show-markup-message ()
|
(defun notmuch-show-markup-message ()
|
||||||
(if (re-search-forward notmuch-show-message-begin-regexp nil t)
|
(if (re-search-forward notmuch-show-message-begin-regexp nil t)
|
||||||
(progn
|
(progn
|
||||||
(re-search-forward notmuch-show-depth-regexp)
|
(re-search-forward notmuch-show-depth-regexp)
|
||||||
(let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1)))))
|
(let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1))))
|
||||||
(notmuch-show-markup-header depth)
|
(btn nil))
|
||||||
(notmuch-show-markup-body depth)))
|
(setq btn (notmuch-show-markup-header depth))
|
||||||
|
(notmuch-show-markup-body depth btn)))
|
||||||
(goto-char (point-max))))
|
(goto-char (point-max))))
|
||||||
|
|
||||||
(defun notmuch-show-hide-markers ()
|
(defun notmuch-show-hide-markers ()
|
||||||
|
@ -650,17 +664,6 @@ which this thread was originally shown."
|
||||||
(notmuch-show-markup-message)))
|
(notmuch-show-markup-message)))
|
||||||
(notmuch-show-hide-markers))
|
(notmuch-show-hide-markers))
|
||||||
|
|
||||||
(defun notmuch-show-toggle-body-read-visible ()
|
|
||||||
"Toggle visibility of message bodies of read messages"
|
|
||||||
(interactive)
|
|
||||||
(if notmuch-show-body-read-visible
|
|
||||||
(add-to-invisibility-spec 'notmuch-show-body-read)
|
|
||||||
(remove-from-invisibility-spec 'notmuch-show-body-read))
|
|
||||||
(set 'notmuch-show-body-read-visible (not notmuch-show-body-read-visible))
|
|
||||||
; Need to force the redisplay for some reason
|
|
||||||
(force-window-update)
|
|
||||||
(redisplay t))
|
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun notmuch-show-mode ()
|
(defun notmuch-show-mode ()
|
||||||
"Major mode for viewing a thread with notmuch.
|
"Major mode for viewing a thread with notmuch.
|
||||||
|
@ -689,14 +692,6 @@ view, (remove the \"inbox\" tag from each), with
|
||||||
\\{notmuch-show-mode-map}"
|
\\{notmuch-show-mode-map}"
|
||||||
(interactive)
|
(interactive)
|
||||||
(kill-all-local-variables)
|
(kill-all-local-variables)
|
||||||
(set (make-local-variable 'notmuch-show-headers-visible) t)
|
|
||||||
(notmuch-show-toggle-headers-visible)
|
|
||||||
(set (make-local-variable 'notmuch-show-body-read-visible) t)
|
|
||||||
(notmuch-show-toggle-body-read-visible)
|
|
||||||
(set (make-local-variable 'notmuch-show-citations-visible) t)
|
|
||||||
(notmuch-show-toggle-citations-visible)
|
|
||||||
(set (make-local-variable 'notmuch-show-signatures-visible) t)
|
|
||||||
(notmuch-show-toggle-signatures-visible)
|
|
||||||
(add-to-invisibility-spec 'notmuch-show-marker)
|
(add-to-invisibility-spec 'notmuch-show-marker)
|
||||||
(use-local-map notmuch-show-mode-map)
|
(use-local-map notmuch-show-mode-map)
|
||||||
(setq major-mode 'notmuch-show-mode
|
(setq major-mode 'notmuch-show-mode
|
||||||
|
@ -765,7 +760,16 @@ thread from that buffer can be show when done with this one)."
|
||||||
(if (not (notmuch-show-message-unread-p))
|
(if (not (notmuch-show-message-unread-p))
|
||||||
(progn
|
(progn
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
(notmuch-show-toggle-body-read-visible)))))
|
(let ((btn (forward-button 1)))
|
||||||
|
(while btn
|
||||||
|
(if (button-has-type-p btn 'notmuch-button-body-toggle-type)
|
||||||
|
(push-button))
|
||||||
|
(condition-case err
|
||||||
|
(setq btn (forward-button 1))
|
||||||
|
(error (setq btn nil)))
|
||||||
|
))
|
||||||
|
(beginning-of-buffer)
|
||||||
|
))))
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(defvar notmuch-search-authors-width 40
|
(defvar notmuch-search-authors-width 40
|
||||||
|
@ -803,6 +807,7 @@ thread from that buffer can be show when done with this one)."
|
||||||
(defvar notmuch-search-query-string)
|
(defvar notmuch-search-query-string)
|
||||||
(defvar notmuch-search-oldest-first)
|
(defvar notmuch-search-oldest-first)
|
||||||
|
|
||||||
|
|
||||||
(defun notmuch-search-scroll-up ()
|
(defun notmuch-search-scroll-up ()
|
||||||
"Scroll up, moving point to last message in thread if at end."
|
"Scroll up, moving point to last message in thread if at end."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
|
Loading…
Reference in a new issue