[PATCH WIP v3 1/3] emacs: show: mark tags changed since buffer loaded

Jani Nikula jani at nikula.org
Mon Dec 9 00:44:18 PST 2013


On Thu, 05 Dec 2013, Mark Walters <markwalters1009 at gmail.com> wrote:
> This shows any tags changed in the show buffer since it was loaded or
> refreshed. By default a removed tag is displayed with strike-through
> in red and an added tag is displayed underlined in green.
>
> One nice feature is that this makes it clear when a message was unread
> when you first loaded the buffer (previously the unread tag could be
> removed before a user realised that it had been unread).

I really like how this works. Very nice!

I did notice a small wrinkle though. On a terminal the strike-through
does not work, and the appearance is that the tag was not removed (until
you refresh with '='). I don't know if you can easily adapt the face or
disable the whole feature when on terminal. Or make this an opt-in
feature. I guess some people might not like this in general, so a way to
disable might be a good idea too. Fine tuning.

BR,
Jani.




> ---
>  emacs/notmuch-show.el |   34 +++++++++++++++++++++++++++++-----
>  emacs/notmuch-tag.el  |   30 ++++++++++++++++++++----------
>  2 files changed, 49 insertions(+), 15 deletions(-)
>
> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
> index 784644c..d64d407 100644
> --- a/emacs/notmuch-show.el
> +++ b/emacs/notmuch-show.el
> @@ -211,6 +211,18 @@ For example, if you wanted to remove an \"unread\" tag and add a
>    :type '(repeat string)
>    :group 'notmuch-show)
>  
> +(defface notmuch-show-deleted-tag-face
> +  '((t :strike-through "red" :inherit 'notmuch-tag-face))
> +  "Face for tags that have been removed"
> +  :group 'notmuch-show
> +  :group 'notmuch-faces)
> +
> +(defface notmuch-show-added-tag-face
> +  '((t :underline "green"))
> +  "Face for tags that have been added"
> +  :group 'notmuch-show
> +  :group 'notmuch-faces)
> +
>  
>  (defmacro with-current-notmuch-show-message (&rest body)
>    "Evaluate body with current buffer set to the text of current message"
> @@ -341,11 +353,21 @@ operation on the contents of the current buffer."
>    "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)
> -				 ")"))))))
> +    (let* ((orig-tags (notmuch-show-get-prop :orig-tags))
> +	   (all-tags (sort (delete-dups (append tags orig-tags)) #'string<))
> +	   (display-tags (mapcar (lambda (tag) (cond ((and (member tag tags) (member tag orig-tags))
> +						      tag)
> +						     ((not (member tag tags))
> +						      (cons tag 'deleted))
> +						     ((not (member tag orig-tags))
> +						      (cons tag 'added))))
> +				 all-tags)))
> +
> +      (if (re-search-forward "(\\([^()]*\\))$" (line-end-position) t)
> +	  (let ((inhibit-read-only t))
> +	    (replace-match (concat "("
> +				   (notmuch-tag-format-tags display-tags)
> +				   ")")))))))
>  
>  (defun notmuch-clean-address (address)
>    "Try to clean a single email ADDRESS for display. Return a cons
> @@ -1167,6 +1189,8 @@ function is used."
>  
>        (jit-lock-register #'notmuch-show-buttonise-links)
>  
> +      (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 (notmuch-sanitize (notmuch-show-strip-re (notmuch-show-get-subject))))
>  
> diff --git a/emacs/notmuch-tag.el b/emacs/notmuch-tag.el
> index b60f46c..fac2c3b 100644
> --- a/emacs/notmuch-tag.el
> +++ b/emacs/notmuch-tag.el
> @@ -137,16 +137,26 @@ This can be used with `notmuch-tag-format-image-data'."
>  
>  (defun notmuch-tag-format-tag (tag)
>    "Format TAG by looking into `notmuch-tag-formats'."
> -  (let ((formats (assoc tag notmuch-tag-formats)))
> -    (cond
> -     ((null formats)		;; - Tag not in `notmuch-tag-formats',
> -      tag)			;;   the format is the tag itself.
> -     ((null (cdr formats))	;; - Tag was deliberately hidden,
> -      nil)			;;   no format must be returned
> -     (t				;; - Tag was found and has formats,
> -      (let ((tag tag))		;;   we must apply all the formats.
> -	(dolist (format (cdr formats) tag)
> -	  (setq tag (eval format))))))))
> +  (let* ((status (if (consp tag) (cdr tag)))
> +	 (tag (if (consp tag) (car tag) tag))
> +	 (formats (append (assoc tag notmuch-tag-formats)))
> +	 (tag
> +	  (cond
> +	   ((null formats)		;; - Tag not in `notmuch-tag-formats',
> +	    tag)		        ;;   the format is the tag itself.
> +	   ((null (cdr formats))        ;; - Tag was deliberately hidden,
> +	    nil)		        ;;   no format must be returned
> +	   (t				;; - Tag was found and has formats,
> +	    (let ((tag tag))		;;   we must apply all the formats.
> +	      (dolist (format (cdr formats) tag)
> +		(setq tag (eval format))))))))
> +    (when tag
> +      (cond
> +       ((eq status 'deleted)
> +	(notmuch-combine-face-text-property-string tag 'notmuch-show-deleted-tag-face))
> +       ((eq status 'added)
> +	(notmuch-combine-face-text-property-string tag 'notmuch-show-added-tag-face))
> +       (t tag)))))
>  
>  (defun notmuch-tag-format-tags (tags)
>    "Return a string representing formatted TAGS."
> -- 
> 1.7.9.1
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list