On Thu, 24 Dec 2009 10:38:54 -0400, david@tethera.net wrote: > From: David Bremner <bremner@unb.ca> > > This is a fairly intrusive rewrite. > > - I pulled the common code for the signature and citation case out > into a separate function. This is not so much shorter, but I think it > will be easier to maintain. > > - I replaced the sequence of (looking-at blah) (forward-line) with a single > re-search-forward per citation. > > New variables > > - notmuch-show-signature-button-format, notmuch-show-citation-button-format > Allow customization of button text. > > - notmuch-show-citation-lines-min > Do not buttonize citations below the given threshold. I like this idea, but this patch hides all citations larger than the threshold. I'd like to see limited lines of citations been displayed. For example: > Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do > eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enimad > minim veniam, quis nostrud exercitation ullamco laboris nisi ut > aliquip ex ea commodo consequat. Duis aute irure dolor in [ 6-line hidden citation. Click/Enter to show ] And click the button shows the rest. > --- > > I decided to start with a simple threshold, and only convert > sufficiently long citations to buttons. Once I started messing with > that code, I decided to rework it to be more maintainable and > hopefully faster. > > This patch also fixes the problem of merging cites separated by a > single line of whitespace This is also fixed by the much simpler > <1260769295-12924-3-git-send-email-kanru@kanru.info>, but unlike that > patch there _shouldn't_ be a problem with eating the blank line after > a citation. I'm not sure about the other bugs fixed by Kan-Ru's > series; perhaps Kan-Ru can comment. > > notmuch.el | 130 > ++++++++++++++++++++++++++++++++++++++---------------------- 1 files > changed, 83 insertions(+), 47 deletions(-) > > diff --git a/notmuch.el b/notmuch.el > index 97914f2..6a5ceea 100644 > --- a/notmuch.el > +++ b/notmuch.el > @@ -92,9 +92,24 @@ for indentation at the beginning of the line. But notmuch will > move past the indentation when testing this pattern, (so that the > pattern can still test against the entire line).") > > +(defvar notmuch-show-signature-button-format > + "[ %d-line hidden signature. Click/Enter to show ]" > + "String used to construct button text for hidden signatures > + > +Can use up to one integer format parameter, i.e. %d") > + > +(defvar notmuch-show-citation-button-format > + "[ %d-line hidden citation. Click/Enter to show ]" > + "String used to construct button text for hidden citations. > + > +Can use up to one integer format parameter, i.e. %d") > + > (defvar notmuch-show-signature-lines-max 12 > "Maximum length of signature that will be hidden by default.") > > +(defvar notmuch-show-citation-lines-min 4 > + "Minimum length of citation that will be hidden.") > + > (defvar notmuch-command "notmuch" > "Command to run the notmuch binary.") > > @@ -593,54 +608,75 @@ which this thread was originally shown." > 'face 'notmuch-message-summary-face > :supertype 'notmuch-button-invisibility-toggle-type) > > +(defun notmuch-show-citation-regexp (depth) > + "Build a regexp for matching citations at a given DEPTH (indent)" > + (let ((line-regexp (format "[[:space:]]\\{%d\\}*>.*\n" depth))) > + (concat "\\(?:^" line-regexp > + "\\(?:[[:space:]]*\n" line-regexp > + "\\)?\\)+"))) > + > +(defun notmuch-show-region-to-button (beg end type prefix button-text) > + "Auxilary function to do the actual making of overlays and buttons > + > +BEG and END are buffer locations. TYPE should a string, either > +\"citation\" or \"signature\". PREFIX is some arbitrary text to > +insert before the button, probably for indentation. BUTTON-TEXT > +is what to put on the button." > + > +;; This uses some slightly tricky conversions between strings and > +;; symbols because of the way the button code works. Note that > +;; replacing intern-soft with make-symbol will cause this to fail, > +;; since the newly created symbol has no plist. > + > + (let ((overlay (make-overlay beg end)) > + (invis-spec (make-symbol (concat "notmuch-" type "-region"))) > + (button-type (intern-soft (concat "notmuch-button-" > + type "-toggle-type")))) > + (add-to-invisibility-spec invis-spec) > + (overlay-put overlay 'invisible invis-spec) > + (goto-char (1+ end)) > + (save-excursion > + (goto-char (1- beg)) > + (insert prefix) > + (insert-button button-text > + 'invisibility-spec invis-spec > + :type button-type) > + ))) > + > + > (defun notmuch-show-markup-citations-region (beg end depth) > - (goto-char beg) > - (beginning-of-line) > - (while (< (point) end) > - (let ((beg-sub (point-marker)) > - (indent (make-string depth ? )) > - (citation ">")) > - (move-to-column depth) > - (if (looking-at citation) > - (progn > - (while (looking-at citation) > - (forward-line) > - (move-to-column depth)) > - (let ((overlay (make-overlay beg-sub (point))) > - (invis-spec (make-symbol "notmuch-citation-region"))) > - (add-to-invisibility-spec invis-spec) > - (overlay-put overlay 'invisible invis-spec) > - (let ((p (point-marker)) > - (cite-button-text > - (concat "[" (number-to-string (count-lines beg-sub (point))) > - "-line citation. Click/Enter to show.]"))) > - (goto-char (- beg-sub 1)) > - (insert (concat "\n" indent)) > - (insert-button cite-button-text > - 'invisibility-spec invis-spec > - :type 'notmuch-button-citation-toggle-type) > - (forward-line) > - )))) > - (move-to-column depth) > - (if (looking-at notmuch-show-signature-regexp) > - (let ((sig-lines (- (count-lines beg-sub end) 1))) > - (if (<= sig-lines notmuch-show-signature-lines-max) > - (progn > - (let ((invis-spec (make-symbol "notmuch-signature-region"))) > - (add-to-invisibility-spec invis-spec) > - (overlay-put (make-overlay beg-sub end) > - 'invisible invis-spec) > - > - (goto-char (- beg-sub 1)) > - (insert (concat "\n" indent)) > - (let ((sig-button-text (concat "[" (number-to-string sig-lines) > - "-line signature. Click/Enter to show.]"))) > - (insert-button sig-button-text 'invisibility-spec invis-spec > - :type 'notmuch-button-signature-toggle-type) > - ) > - (insert "\n") > - (goto-char end)))))) > - (forward-line)))) > + "Markup citations, and up to one signature in the given region" > + > + (let ((citation-regexp (notmuch-show-citation-regexp depth)) > + (signature-regexp (concat (format "^[[:space:]]\\{%d\\}" depth) > + notmuch-show-signature-regexp)) > + (indent (make-string depth ? ))) > + (goto-char beg) > + (beginning-of-line) > + (while (and (< (point) end) > + (re-search-forward citation-regexp end t)) > + (let* ((cite-start (match-beginning 0)) > + (cite-end (match-end 0)) > + (cite-lines (count-lines cite-start cite-end))) > + (if (>= cite-lines notmuch-show-citation-lines-min) > + (notmuch-show-region-to-button > + cite-start cite-end > + "citation" > + indent > + (format notmuch-show-citation-button-format cite-lines) > + )))) > + (if (re-search-forward signature-regexp end t) > + (let* ((sig-start (match-beginning 0)) > + (sig-end (match-end 0)) > + (sig-lines (1- (count-lines sig-start end)))) > + (if (<= sig-lines notmuch-show-signature-lines-max) > + (notmuch-show-region-to-button > + sig-start > + end > + "signature" > + indent > + (format notmuch-show-signature-button-format sig-lines) > + )))))) > > (defun notmuch-show-markup-part (beg end depth) > (if (re-search-forward notmuch-show-part-begin-regexp nil t) > -- > 1.6.5.7 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch -- Kan-Ru Chen | http://kanru.info Q: Why are my replies five sentences or less? A: http://five.sentenc.es/