It's annoying that the wrapping of long lines doesn't respect the
indentation of the message. Here's an attempt to improve that.

The wrapping code is in a separate file and has a silly name[1], but all
of that is subject to change at the whim of Carl or his minions.

If anyone tries this then I'd be interested in your feedback,
particularly if it doesn't work or doesn't look the way that you expect.

Footnotes: 
[1]  It's a long-line wrapper...

>From d49ff05ef86b652ec4883d7075df4fb65c846342 Mon Sep 17 00:00:00 2001
From: David Edmondson <d...@dme.org>
Date: Tue, 16 Feb 2010 09:03:18 +0000
Subject: [PATCH] notmuch.el: Improved wrapping of long lines - respect the indentation
 level.

---
 Makefile.local   |    2 +-
 notmuch-coolj.el |   40 ++++++++++++++++++++++++++++++++++++++++
 notmuch.el       |    9 ++++++---
 3 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 notmuch-coolj.el

diff --git a/Makefile.local b/Makefile.local
index 04bac83..44a786a 100644
--- a/Makefile.local
+++ b/Makefile.local
@@ -1,4 +1,4 @@
-emacs: notmuch.elc
+emacs: notmuch.elc notmuch-coolj.el
 
 notmuch_client_srcs =		\
 	$(notmuch_compat_srcs)	\
diff --git a/notmuch-coolj.el b/notmuch-coolj.el
new file mode 100644
index 0000000..6b4da6d
--- /dev/null
+++ b/notmuch-coolj.el
@@ -0,0 +1,40 @@
+(defgroup notmuch-coolj nil
+  "Automatic wrapping of long lines when displaying notmuch articles."
+  :group 'notmuch)
+
+(defcustom notmuch-coolj-prefix-regexp " *\\(>+ +\\)?"
+  "A regexp matching potential line prefixes.")
+
+(defun notmuch-coolj-wrap-region (beg end)
+  "Wrap lines in the region."
+  (goto-char beg)
+  (forward-line -1)
+  (while (not (>= (point) end))
+    (notmuch-coolj-wrap-line)
+    (forward-line)))
+
+(defun notmuch-coolj-wrap-line ()
+  "Wrap the current line, if necessary."
+  (let ((prefix (notmuch-coolj-determine-prefix))
+	(start (point))
+	(end (make-marker))
+	(width (window-width)))
+    (set-marker end (save-excursion (end-of-line) (point)))
+    (while (> end (+ (point) width))
+      (forward-char (window-width))
+      (if (re-search-backward "[^ ]\\( \\)" start t)
+	  (progn
+	    (goto-char (match-beginning 1))
+	    (insert-before-markers ?\n)
+	    (re-search-forward "\\( +\\)[^ ]" nil t)
+	    (delete-region (match-beginning 1) (match-end 1))
+	    (backward-char 1)
+	    (insert-before-markers prefix)))
+      (beginning-of-line))))
+
+(defun notmuch-coolj-determine-prefix ()
+  "Determine the prefix for the current line."
+  (if (looking-at notmuch-coolj-prefix-regexp)
+      (buffer-substring-no-properties (match-beginning 0) (match-end 0))))
+
+(provide 'notmuch-coolj)
diff --git a/notmuch.el b/notmuch.el
index ea74a72..d67b066 100644
--- a/notmuch.el
+++ b/notmuch.el
@@ -51,6 +51,8 @@
 (require 'mm-view)
 (require 'message)
 
+(require 'notmuch-coolj)
+
 (defvar notmuch-show-mode-map
   (let ((map (make-sparse-keymap)))
     (define-key map "?" 'notmuch-help)
@@ -777,7 +779,9 @@ is what to put on the button."
                           (mm-display-part mime-message))))
                 )
 	      (if (equal mime-type "text/plain")
-		  (notmuch-show-markup-citations-region beg end depth))
+		  (progn
+		    (notmuch-show-markup-citations-region beg end depth)
+		    (notmuch-coolj-wrap-region beg end)))
               ; Advance to the next part (if any) (so the outer loop can
               ; determine whether we've left the current message.
               (if (re-search-forward notmuch-show-buttonize-begin-regexp nil t)
@@ -1053,8 +1057,7 @@ All currently available key bindings:
 ; Make show mode a bit prettier, highlighting URLs and using word wrap
 
 (defun notmuch-show-pretty-hook ()
-  (goto-address-mode 1)
-  (visual-line-mode))
+  (goto-address-mode 1))
 
 (add-hook 'notmuch-show-hook 'notmuch-show-pretty-hook)
 (add-hook 'notmuch-search-hook
-- 
1.6.6.1

dme.
-- 
David Edmondson, http://dme.org
_______________________________________________
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to