Austin, Thanks for the helpful comments. I redid the patch to take a list of regexps. That way users can banish different kinds of tags or simply list the tags themselves. I've responded to your comments in text below the patch. --- emacs/notmuch.el | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index f9454d8..05aa114 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -775,6 +775,21 @@ non-authors is found, assume that all of the authors match." (overlay-put overlay 'isearch-open-invisible #'delete-overlay))) (insert padding)))) + +(defcustom notmuch-search-hide-tag-regexps '() + "List of regular expressionss specifying tags to hide in search view. + +Notmuch will hide any tags in search view that match the regexps +specified in the list `notmuch-search-hide-tag-regexp`. The +match is case-insensitive. + +If you are not comfortable with regular expressions, a list of +tag words will work, assuming those tags use only alphanumeric +characters. An empty list will disable hiding of tags in search +view. The list can be set via setq or the customize interface." + :type '(repeat regexp) + :group 'notmuch-search) + (defun notmuch-search-insert-field (field format-string result) (cond ((string-equal field "date") @@ -793,7 +808,16 @@ non-authors is found, assume that all of the authors match." (notmuch-search-insert-authors format-string (plist-get result :authors))) ((string-equal field "tags") - (let ((tags-str (mapconcat 'identity (plist-get result :tags) " "))) + (let ((tags-str + (mapconcat 'identity + (let ((case-fold-search t)) + (remove-if + (lambda (tag) + (find tag notmuch-search-hide-tag-regexps + :test (lambda (tag regexp) + (string-match regexp tag)))) + (plist-get result :tags))) + " "))) (insert (propertize (format format-string tags-str) 'face 'notmuch-tag-face)))))) -- 1.7.10.4 Austin Clements writes: > I like it. Thanks. [snip] > I have no idea why, but Emacs typically uses "regexp" instead of > "regex". It probably has something to do with rhyming with 'sexp'. ;) It's good to conform to the vernacular, so I fixed it. > >> + >> +Leave blank to disable hiding of tags in search view. > > Saying "Leave blank" supposes that the user knows what the default > value is. How about "An empty string disables hiding of tags in > search view."? I'm now using a list, but yes, "an empty list" is a good way to describe it. > > Even better, though, would be to use nil to indicate this, since "" is > a perfectly valid regexp and matches everything. In that case, this > should say something like "If nil, no tags will be hidden in search > view." "An empty list" is nil, so I think this is covered by my changes. If you think the defcustom text could be clearer, I'd appreciate edits. > >> +Note: elisp regexes are case-insensitive" > > Likewise, "regexps". Also, Elisp regexps are not, in general, > case-insensitive. If we want to control this, we should bind > case-fold-search to nil around the string-match below and say > something here like "Matching is case-insensitive." Good point. > >> + :type 'string > > Better would be 'regexp. Or, '(choice (const :tag "None" nil) regexp) > to allow nil or a regexp. Changed to 'regexp. [snip] > It would be simpler and more robust to use remove-if here. What about > something like > > (let ((tags-str > (mapconcat 'identity > (if notmuch-search-hide-tag-regex > (let ((case-fold-search t)) > (remove-if > (apply-partially #'string-match > notmuch-search-hide-tag-regex) > (plist-get result :tags))) > (plist-get result :tags)) > " "))) That's a good idea. I adjusted the code to use remove-if, and it is improved by the change. Thanks, James