; kudos: Notmuch list <notmuch@notmuchmail.org> (subscription is not
; required, but is available from http://notmuchmail.org).
-(require 'cl)
+(eval-when-compile (require 'cl))
(require 'mm-view)
(require 'message)
"Tag/face mapping for line highlighting in notmuch-search.
Here is an example of how to color search results based on tags.
-(the following text would be placed in your ~/.emacs file):
+ (the following text would be placed in your ~/.emacs file):
-(setq notmuch-search-line-faces '((\"delete\" . '(:foreground \"red\"))
- (\"unread\" . '(:foreground \"green\"))))
+ (setq notmuch-search-line-faces '((\"delete\" . '(:foreground \"red\"))
+ (\"unread\" . '(:foreground \"green\"))))
Order matters: for lines with multiple tags, the the first
matching will be applied."
(t
(setq tags-faces (cdr tags-faces)))))))))
+(defun notmuch-search-isearch-authors-show (overlay)
+ (remove-from-invisibility-spec (cons (overlay-get overlay 'invisible) t)))
+
(defun notmuch-search-insert-authors (format-string authors)
- (insert (let* ((formatted-sample (format format-string ""))
- (formatted-authors (format format-string authors))
- (truncated-string
- (if (> (length formatted-authors)
- (length formatted-sample))
- (concat (substring authors 0 (- (length formatted-sample) 4)) "... ")
- formatted-authors)))
- ;; Need to save the match data to avoid interfering with
- ;; `notmuch-search-process-filter'.
- (save-match-data
- (if (string-match "\\(.*\\)|\\(..*\\)" truncated-string)
- (concat (propertize (concat (match-string 1 truncated-string) ",")
- 'face 'notmuch-search-matching-authors)
- (propertize (match-string 2 truncated-string)
- 'face 'notmuch-search-non-matching-authors))
- (propertize truncated-string 'face 'notmuch-search-matching-authors))))))
+ (let* ((propertized-authors
+ ;; Need to save the match data to avoid interfering with
+ ;; `notmuch-search-process-filter'.
+ (save-match-data
+ ;; Authors that don't match the search query are shown in a
+ ;; different font.
+ (if (string-match "\\(.*\\)|\\(..*\\)" authors)
+ (concat (propertize (concat (match-string 1 authors) ",")
+ 'face 'notmuch-search-matching-authors)
+ (propertize (match-string 2 authors)
+ 'face 'notmuch-search-non-matching-authors))
+ (propertize authors 'face 'notmuch-search-matching-authors))))
+
+ (formatted-sample (format format-string ""))
+ (formatted-authors (format format-string propertized-authors))
+ visible-string invisible-string)
+
+ ;; Determine the part of the authors that will be visible by
+ ;; default.
+ (if (> (length formatted-authors)
+ (length formatted-sample))
+ ;; 4 is `(length "... ")'.
+ (let ((visible-length (- (length formatted-sample) 4)))
+ (setq visible-string (substring propertized-authors 0 visible-length)
+ invisible-string (substring propertized-authors visible-length)))
+ (setq visible-string formatted-authors
+ invisible-string nil))
+
+ ;; Insert both the visible and invisible author strings.
+ (insert visible-string)
+ (when invisible-string
+ (let ((start (point))
+ (invis-spec (make-symbol "notmuch-search-authors"))
+ overlay)
+ (insert invisible-string)
+ ;; Using a cons-cell here causes an ellipsis to be inserted
+ ;; instead of the invisible text.
+ (add-to-invisibility-spec (cons invis-spec t))
+ (setq overlay (make-overlay start (point)))
+ (overlay-put overlay 'invisible invis-spec)
+ (overlay-put overlay 'isearch-open-invisible #'notmuch-search-isearch-authors-show)
+ (insert " ")))))
(defun notmuch-search-insert-field (field date count authors subject tags)
(cond
(more t)
(inhibit-read-only t))
(while more
- (if (string-match "^\\(thread:[0-9A-Fa-f]*\\) \\(.*\\) \\(\\[[0-9/]*\\]\\) \\([^;]*\\); \\(.*\\) (\\([^()]*\\))$" string line)
+ (if (string-match "^\\(thread:[0-9A-Fa-f]*\\) \\([^][]*\\) \\(\\[[0-9/]*\\]\\) \\([^;]*\\); \\(.*\\) (\\([^()]*\\))$" string line)
(let* ((thread-id (match-string 1 string))
(date (match-string 2 string))
(count (match-string 3 string))
(defun notmuch-search-buffer-title (query)
"Returns the title for a buffer with notmuch search results."
- (let* ((saved-search (rassoc-if (lambda (key)
- (string-match (concat "^" (regexp-quote key))
- query))
- (reverse (notmuch-saved-searches))))
+ (let* ((saved-search
+ (let (longest
+ (longest-length 0))
+ (loop for tuple in notmuch-saved-searches
+ if (let ((quoted-query (regexp-quote (cdr tuple))))
+ (and (string-match (concat "^" quoted-query) query)
+ (> (length (match-string 0 query))
+ longest-length)))
+ do (setq longest tuple))
+ longest))
(saved-search-name (car saved-search))
(saved-search-query (cdr saved-search)))
(cond ((and saved-search (equal saved-search-query query))