unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: David Edmondson <dme@dme.org>
To: notmuch@notmuchmail.org
Subject: [PATCH] emacs: In search mode, truncate authors using invisible text.
Date: Tue,  4 May 2010 11:55:28 +0100	[thread overview]
Message-ID: <1272970528-7893-1-git-send-email-dme@dme.org> (raw)
In-Reply-To: <87ljc0k9xk.fsf@yoom.home.cworth.org>

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.
---
 emacs/notmuch.el |   61 +++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index c2fefe5..10babe4 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -608,23 +608,52 @@ 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
-- 
1.7.0

  reply	other threads:[~2010-05-04 10:54 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-23 17:39 [PATCH] emacs: Fix i-search to open up invisible citations as necessary David Edmondson
2010-04-24 14:42 ` Carl Worth
2010-04-24 16:58   ` Dirk Hohndel
2010-04-30 16:00   ` all authors and subjects in the search buffer [was: Re: [PATCH] emacs: Fix i-search to open up invisible citations as necessary] David Edmondson
2010-05-03 20:27     ` Carl Worth
2010-05-04 10:55       ` David Edmondson [this message]
2010-05-04 10:56       ` David Edmondson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1272970528-7893-1-git-send-email-dme@dme.org \
    --to=dme@dme.org \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).