From bde9284064e71e88ba68718c14b9697a98873adb Mon Sep 17 00:00:00 2001 From: Alexander Botero-Lowry Date: Mon, 23 Nov 2009 22:25:33 -0800 Subject: [PATCH 1/5] make headers locally expandable/collapsable This is the same as with citations and signatures. I used an ellipsis here for the invisible region, which I think make it more obvious that there are extra headers. MH-e used this for extra long To/CC headers. --- notmuch.el | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/notmuch.el b/notmuch.el index fa6e7de4..8aee2864 100644 --- a/notmuch.el +++ b/notmuch.el @@ -605,7 +605,8 @@ which this thread was originally shown." (end-of-line) ; Inverse video for subject (overlay-put (make-overlay beg (point)) 'face '(:inverse-video t)) - (forward-line 2) + (forward-line 1) + (end-of-line) (let ((beg-hidden (point-marker))) (re-search-forward notmuch-show-header-end-regexp) (beginning-of-line) @@ -619,8 +620,19 @@ which this thread was originally shown." (forward-line) ) (indent-rigidly beg end depth) - (overlay-put (make-overlay beg-hidden end) - 'invisible 'notmuch-show-header) + (let ((invis-spec (make-symbol "notmuch-show-header"))) + (add-to-invisibility-spec (cons invis-spec t)) + (overlay-put (make-overlay beg-hidden end) + 'invisible invis-spec) + (goto-char beg) + (forward-line) + (let ((header-button (make-button (line-beginning-position) (line-end-position)))) + (button-put header-button 'invisibility-spec (cons invis-spec t)) + (button-put header-button 'action 'notmuch-toggle-invisible-action) + (button-put header-button 'follow-link t) + (button-put header-button 'help-echo + "mouse-1, RET: Show headers") + )) (goto-char end) (insert "\n") (set-marker beg nil) From 60817c39d83a67e0dca5e154588672d962d24c5c Mon Sep 17 00:00:00 2001 From: Alexander Botero-Lowry Date: Mon, 23 Nov 2009 22:28:56 -0800 Subject: [PATCH 2/5] cleanup a lot of left-overs from the global invis Basically I'd left in a lot of the key-bindings and all the invisiblity spec variables so just rid the world of those --- notmuch.el | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/notmuch.el b/notmuch.el index 8aee2864..ed1f7cb5 100644 --- a/notmuch.el +++ b/notmuch.el @@ -62,8 +62,6 @@ (define-key map "a" 'notmuch-show-archive-thread) (define-key map "A" 'notmuch-show-mark-read-then-archive-thread) (define-key map "b" 'notmuch-show-toggle-body-read-visible) - (define-key map "c" 'notmuch-show-toggle-citations-visible) - (define-key map "h" 'notmuch-show-toggle-headers-visible) (define-key map "m" 'message-mail) (define-key map "n" 'notmuch-show-next-message) (define-key map "N" 'notmuch-show-mark-read-then-next-open-message) @@ -72,7 +70,6 @@ (define-key map (kbd "C-p") 'notmuch-show-previous-line) (define-key map "q" 'kill-this-buffer) (define-key map "r" 'notmuch-show-reply) - (define-key map "s" 'notmuch-show-toggle-signatures-visible) (define-key map "v" 'notmuch-show-view-all-mime-parts) (define-key map "w" 'notmuch-show-view-raw-message) (define-key map "x" 'kill-this-buffer) @@ -666,39 +663,6 @@ which this thread was originally shown." (notmuch-show-markup-message))) (notmuch-show-hide-markers)) -(defun notmuch-show-toggle-citations-visible () - "Toggle visibility of citations" - (interactive) - (if notmuch-show-citations-visible - (add-to-invisibility-spec 'notmuch-show-citation) - (remove-from-invisibility-spec 'notmuch-show-citation)) - (set 'notmuch-show-citations-visible (not notmuch-show-citations-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - -(defun notmuch-show-toggle-signatures-visible () - "Toggle visibility of signatures" - (interactive) - (if notmuch-show-signatures-visible - (add-to-invisibility-spec 'notmuch-show-signature) - (remove-from-invisibility-spec 'notmuch-show-signature)) - (set 'notmuch-show-signatures-visible (not notmuch-show-signatures-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - -(defun notmuch-show-toggle-headers-visible () - "Toggle visibility of header fields" - (interactive) - (if notmuch-show-headers-visible - (add-to-invisibility-spec 'notmuch-show-header) - (remove-from-invisibility-spec 'notmuch-show-header)) - (set 'notmuch-show-headers-visible (not notmuch-show-headers-visible)) - ; Need to force the redisplay for some reason - (force-window-update) - (redisplay t)) - (defun notmuch-show-toggle-body-read-visible () "Toggle visibility of message bodies of read messages" (interactive) From 9eb90688b701b906b984eb433107acb7d3c5a288 Mon Sep 17 00:00:00 2001 From: Alexander Botero-Lowry Date: Mon, 23 Nov 2009 22:37:49 -0800 Subject: [PATCH 3/5] make a nice function for generating invisibility toggle buttons I realized I was replicating this code over and over again, so this way if I change my mind about something I only have to do it on one place. --- notmuch.el | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/notmuch.el b/notmuch.el index ed1f7cb5..23a07cca 100644 --- a/notmuch.el +++ b/notmuch.el @@ -497,6 +497,13 @@ which this thread was originally shown." (force-window-update) (redisplay t)) +(defun notmuch-configure-invisibility-button (btn invis-spec help-msg) + (button-put btn 'invisibility-spec invis-spec) + (button-put btn 'action 'notmuch-toggle-invisible-action) + (button-put btn 'follow-link t) + (button-put btn 'help-echo (concat "mouse-1, RET: " help-msg)) +) + (defun notmuch-show-markup-citations-region (beg end depth) (goto-char beg) (beginning-of-line) @@ -512,22 +519,13 @@ which this thread was originally shown." (invis-spec (make-symbol "notmuch-citation-region"))) (add-to-invisibility-spec invis-spec) (overlay-put overlay 'invisible invis-spec) - (let ( - (p (point)) + (let ((p (point)) (cite-button-text (concat "[" (number-to-string (count-lines beg-sub (point))) - "-line citation.]")) - ) + "-line citation.]"))) (goto-char (- beg-sub 1)) (insert (concat "\n" indent)) - (let ((cite-button (insert-button cite-button-text))) - (button-put cite-button 'invisibility-spec invis-spec) - (button-put cite-button 'action 'notmuch-toggle-invisible-action) - (button-put cite-button 'follow-link t) - (button-put cite-button 'help-echo - "mouse-1, RET: Show citation") - - ) + (notmuch-configure-invisibility-button (insert-button cite-button-text) invis-spec "Show citation") (insert "\n") (goto-char (+ (length cite-button-text) p)) )))) @@ -543,16 +541,9 @@ which this thread was originally shown." (goto-char (- beg-sub 1)) (insert (concat "\n" indent)) - (let ((sig-button (insert-button - (concat "[" (number-to-string sig-lines) - "-line signature.]")))) - (button-put sig-button 'invisibility-spec invis-spec) - (button-put sig-button 'action - 'notmuch-toggle-invisible-action) - (button-put sig-button 'follow-link t) - (button-put sig-button 'help-echo - "mouse-1, RET: Show signature") - ) + (notmuch-configure-invisibility-button + (insert-button (concat "[" (number-to-string sig-lines) + "-line signature.]")) invis-spec "Show signature") (insert "\n") (goto-char end)))))) (forward-line)))) @@ -623,13 +614,9 @@ which this thread was originally shown." 'invisible invis-spec) (goto-char beg) (forward-line) - (let ((header-button (make-button (line-beginning-position) (line-end-position)))) - (button-put header-button 'invisibility-spec (cons invis-spec t)) - (button-put header-button 'action 'notmuch-toggle-invisible-action) - (button-put header-button 'follow-link t) - (button-put header-button 'help-echo - "mouse-1, RET: Show headers") - )) + (notmuch-configure-invisibility-button + (make-button (line-beginning-position) (line-end-position)) + (cons invis-spec t) "Show headers")) (goto-char end) (insert "\n") (set-marker beg nil) From daeda152b8cdb662100129385212175b425c33c5 Mon Sep 17 00:00:00 2001 From: Alexander Botero-Lowry Date: Mon, 23 Nov 2009 23:39:57 -0800 Subject: [PATCH 4/5] 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 --- notmuch.el | 89 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/notmuch.el b/notmuch.el index 23a07cca..af0c487e 100644 --- a/notmuch.el +++ b/notmuch.el @@ -497,12 +497,15 @@ which this thread was originally shown." (force-window-update) (redisplay t)) -(defun notmuch-configure-invisibility-button (btn invis-spec help-msg) - (button-put btn 'invisibility-spec invis-spec) - (button-put btn 'action 'notmuch-toggle-invisible-action) - (button-put btn 'follow-link t) - (button-put btn 'help-echo (concat "mouse-1, RET: " help-msg)) -) +(define-button-type 'notmuch-button-invisibility-toggle-type 'action 'notmuch-toggle-invisible-action 'follow-link t) +(define-button-type 'notmuch-button-citation-toggle-type 'help-echo "mouse-1, RET: Show citation" + :supertype 'notmuch-button-invisibility-toggle-type) +(define-button-type 'notmuch-button-signature-toggle-type 'help-echo "mouse-1, RET: Show signature" + :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) (goto-char beg) @@ -525,7 +528,9 @@ which this thread was originally shown." "-line citation.]"))) (goto-char (- beg-sub 1)) (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") (goto-char (+ (length cite-button-text) p)) )))) @@ -541,9 +546,11 @@ which this thread was originally shown." (goto-char (- beg-sub 1)) (insert (concat "\n" indent)) - (notmuch-configure-invisibility-button - (insert-button (concat "[" (number-to-string sig-lines) - "-line signature.]")) invis-spec "Show signature") + (let ((sig-button-text (concat "[" (number-to-string sig-lines) + "-line signature.]"))) + (insert-button sig-button-text 'invisibility-spec invis-spec + :type 'notmuch-button-signature-toggle-type) + ) (insert "\n") (goto-char end)))))) (forward-line)))) @@ -572,16 +579,19 @@ which this thread was originally shown." (while (< (point) end) (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) (forward-line) (let ((beg (point-marker))) (re-search-forward notmuch-show-body-end-regexp) (let ((end (copy-marker (match-beginning 0)))) (notmuch-show-markup-parts-region beg end depth) - (if (not (notmuch-show-message-unread-p)) - (overlay-put (make-overlay beg end) - 'invisible 'notmuch-show-body-read)) + (let ((invis-spec (make-symbol "notmuch-show-body-read"))) + (overlay-put (make-overlay beg end) + '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 end nil) ))) @@ -589,10 +599,12 @@ which this thread was originally shown." (defun notmuch-show-markup-header (depth) (re-search-forward notmuch-show-header-begin-regexp) (forward-line) - (let ((beg (point-marker))) + (let ((beg (point-marker)) + (btn nil)) (end-of-line) ; Inverse video for subject (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) (end-of-line) (let ((beg-hidden (point-marker))) @@ -614,23 +626,25 @@ which this thread was originally shown." 'invisible invis-spec) (goto-char beg) (forward-line) - (notmuch-configure-invisibility-button - (make-button (line-beginning-position) (line-end-position)) - (cons invis-spec t) "Show headers")) + (make-button (line-beginning-position) (line-end-position) + 'invisibility-spec (cons invis-spec t) + :type 'notmuch-button-headers-toggle-type)) (goto-char end) (insert "\n") (set-marker beg nil) (set-marker beg-hidden nil) (set-marker end nil) - )))) + )) + btn)) (defun notmuch-show-markup-message () (if (re-search-forward notmuch-show-message-begin-regexp nil t) (progn (re-search-forward notmuch-show-depth-regexp) - (let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1))))) - (notmuch-show-markup-header depth) - (notmuch-show-markup-body depth))) + (let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1)))) + (btn nil)) + (setq btn (notmuch-show-markup-header depth)) + (notmuch-show-markup-body depth btn))) (goto-char (point-max)))) (defun notmuch-show-hide-markers () @@ -650,17 +664,6 @@ which this thread was originally shown." (notmuch-show-markup-message))) (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 (defun notmuch-show-mode () "Major mode for viewing a thread with notmuch. @@ -689,14 +692,6 @@ view, (remove the \"inbox\" tag from each), with \\{notmuch-show-mode-map}" (interactive) (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) (use-local-map notmuch-show-mode-map) (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)) (progn (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 @@ -803,6 +807,7 @@ thread from that buffer can be show when done with this one)." (defvar notmuch-search-query-string) (defvar notmuch-search-oldest-first) + (defun notmuch-search-scroll-up () "Scroll up, moving point to last message in thread if at end." (interactive) From 0ad3534b949b4a9848051197aa51c9c8ce3f81fb Mon Sep 17 00:00:00 2001 From: Alexander Botero-Lowry Date: Mon, 23 Nov 2009 23:41:42 -0800 Subject: [PATCH 5/5] Remove the global expand body keymapping With local buttons done now, we don't need this anymore. --- notmuch.el | 1 - 1 file changed, 1 deletion(-) diff --git a/notmuch.el b/notmuch.el index af0c487e..907df2c0 100644 --- a/notmuch.el +++ b/notmuch.el @@ -61,7 +61,6 @@ ; overlays-at to query and manipulate the current overlay. (define-key map "a" 'notmuch-show-archive-thread) (define-key map "A" 'notmuch-show-mark-read-then-archive-thread) - (define-key map "b" 'notmuch-show-toggle-body-read-visible) (define-key map "m" 'message-mail) (define-key map "n" 'notmuch-show-next-message) (define-key map "N" 'notmuch-show-mark-read-then-next-open-message)