emacs: In search mode, truncate authors using invisible text.

Rather than discarding authors when truncated to fit the defined
column width, mark the text beyond the end of the column as invisible
and allow `isearch' to be used over the text so hidden.

This allows us to retain the compact display whilst enabling a user to
find the elided text.
This commit is contained in:
David Edmondson 2010-05-19 08:03:37 +01:00 committed by Carl Worth
parent f2525ed18f
commit 17b09af228

View file

@ -608,23 +608,52 @@ matching will be applied."
(t (t
(setq tags-faces (cdr tags-faces))))))))) (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) (defun notmuch-search-insert-authors (format-string authors)
(insert (let* ((formatted-sample (format format-string "")) (let* ((propertized-authors
(formatted-authors (format format-string authors)) ;; Need to save the match data to avoid interfering with
(truncated-string ;; `notmuch-search-process-filter'.
(if (> (length formatted-authors) (save-match-data
(length formatted-sample)) ;; Authors that don't match the search query are shown in a
(concat (substring authors 0 (- (length formatted-sample) 4)) "... ") ;; different font.
formatted-authors))) (if (string-match "\\(.*\\)|\\(..*\\)" authors)
;; Need to save the match data to avoid interfering with (concat (propertize (concat (match-string 1 authors) ",")
;; `notmuch-search-process-filter'. 'face 'notmuch-search-matching-authors)
(save-match-data (propertize (match-string 2 authors)
(if (string-match "\\(.*\\)|\\(..*\\)" truncated-string) 'face 'notmuch-search-non-matching-authors))
(concat (propertize (concat (match-string 1 truncated-string) ",") (propertize authors 'face 'notmuch-search-matching-authors))))
'face 'notmuch-search-matching-authors)
(propertize (match-string 2 truncated-string) (formatted-sample (format format-string ""))
'face 'notmuch-search-non-matching-authors)) (formatted-authors (format format-string propertized-authors))
(propertize truncated-string 'face 'notmuch-search-matching-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) (defun notmuch-search-insert-field (field date count authors subject tags)
(cond (cond