This combines our two face combining functions into one, easy to use function with a much shorter name: `notmuch-apply-face'. This function takes the full set of arguments that `notmuch-combine-face-text-property' took, but takes them in a more convenient order and provides smarter defaults that make the function easy to use on both strings and buffers. ---
Here's the combined, cleaned up face combiner interface I mentioned on IRC. I think the new `notmuch-apply-face' function introduced here would be ideal for use in notmuch-tag-formats to fix the problem with propertize overriding the entire face. emacs/notmuch-lib.el | 35 ++++++++++++++++++----------------- emacs/notmuch-tag.el | 4 ++-- emacs/notmuch-tree.el | 2 +- emacs/notmuch.el | 2 +- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 2fefdad..05be5b8 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -578,23 +578,32 @@ single element face list." face (list face))) -(defun notmuch-combine-face-text-property (start end face &optional below object) - "Combine FACE into the 'face text property between START and END. +(defun notmuch-apply-face (object face &optional start end below) + "Combine FACE into the 'face text property of OBJECT between START and END. This function combines FACE with any existing faces between START -and END in OBJECT (which defaults to the current buffer). -Attributes specified by FACE take precedence over existing -attributes unless BELOW is non-nil. FACE must be a face name (a -symbol or string), a property list of face attributes, or a list -of these. For convenience when applied to strings, this returns -OBJECT." +and END in OBJECT. Attributes specified by FACE take precedence +over existing attributes unless BELOW is non-nil. + +OBJECT may be a string, a buffer, or nil (which means the current +buffer). If object is a string, START and END are 0-based; +otherwise they are buffer positions (integers or markers). FACE +must be a face name (a symbol or string), a property list of face +attributes, or a list of these. If START and/or END are omitted, +they default to the beginning/end of OBJECT. For convenience +when applied to strings, this returns OBJECT." ;; A face property can have three forms: a face name (a string or ;; symbol), a property list, or a list of these two forms. In the ;; list case, the faces will be combined, with the earlier faces ;; taking precedent. Here we canonicalize everything to list form ;; to make it easy to combine. - (let ((pos start) + (let ((pos (cond (start start) + ((stringp object) 0) + (t 1))) + (end (cond (end end) + ((stringp object) (length object)) + (t (1+ (buffer-size object))))) (face-list (notmuch-face-ensure-list-form face))) (while (< pos end) (let* ((cur (get-text-property pos 'face object)) @@ -607,14 +616,6 @@ OBJECT." (setq pos next)))) object) -(defun notmuch-combine-face-text-property-string (string face &optional below) - (notmuch-combine-face-text-property - 0 - (length string) - face - below - string)) - (defun notmuch-map-text-property (start end prop func &optional object) "Transform text property PROP using FUNC. diff --git a/emacs/notmuch-tag.el b/emacs/notmuch-tag.el index 908e7ad..d7deaf0 100644 --- a/emacs/notmuch-tag.el +++ b/emacs/notmuch-tag.el @@ -151,13 +151,13 @@ This can be used with `notmuch-tag-format-image-data'." (defun notmuch-tag-format-tags (tags &optional face) "Return a string representing formatted TAGS." (let ((face (or face 'notmuch-tag-face))) - (notmuch-combine-face-text-property-string + (notmuch-apply-face (mapconcat #'identity ;; nil indicated that the tag was deliberately hidden (delq nil (mapcar #'notmuch-tag-format-tag tags)) " ") face - t))) + nil nil t))) (defcustom notmuch-before-tag-hook nil "Hooks that are run before tags of a message are modified. diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index 4f2ac02..bc4c0b0 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -715,7 +715,7 @@ unchanged ADDRESS if parsing fails." (dolist (spec field-list result-string) (let ((field-string (notmuch-tree-format-field (car spec) (cdr spec) msg))) (setq result-string (concat result-string field-string)))) - (notmuch-combine-face-text-property-string result-string face t))) + (notmuch-apply-face result-string face nil nil t))) (defun notmuch-tree-insert-msg (msg) "Insert the message MSG according to notmuch-tree-result-format" diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 0471750..222d8b1 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -649,7 +649,7 @@ foreground and blue background." (let ((tag (car elem)) (attributes (cdr elem))) (when (member tag line-tag-list) - (notmuch-combine-face-text-property start end attributes)))) + (notmuch-apply-face nil attributes start end)))) ;; Reverse the list so earlier entries take precedence (reverse notmuch-search-line-faces))) -- 1.8.4.rc3