emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nicolas Goaziou <n.goaziou@gmail.com>
To: Daniel Hackney <dan@haxney.org>
Cc: emacs-orgmode@gnu.org
Subject: Re: [BUG] `org-fill-paragraph' doesn't use `fill-prefix'
Date: Sat, 27 Jul 2013 22:45:17 +0200	[thread overview]
Message-ID: <874nbf3f6q.fsf@gmail.com> (raw)
In-Reply-To: <CAMqXDZvu9s2UWbzS0teuLKMLc-e-xV7v8jt36cALpDEc_akk+Q@mail.gmail.com> (Daniel Hackney's message of "Sat, 27 Jul 2013 14:47:26 -0400")

[-- Attachment #1: Type: text/plain, Size: 851 bytes --]

Daniel Hackney <dan@haxney.org> writes:

> I proposed a fix [1] for this back in 2010, but it seems to have regressed
> again. `org-fill-paragraph' no longer makes use of a `fill-prefix', so
> filling things like email comments no longer works.

It has been discussed on this ML already. Org mode is not Message mode
and ">" prefix means nothing to it.

Also, it has its own set of special prefixes, which are not found in
Fundamental mode. For example, you can never have " : " as a fill prefix
since it creates a fixed-width area.

Therefore, I don't consider it to be a regression since it's not an
expected feature in the first place. But I admit it is still convenient.

Maybe we can introduce some support for `adaptive-fill-regexp' in
paragraphs and comments filling. Would you mind testing the following
patch?


Regards,

-- 
Nicolas Goaziou

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-support-for-adaptive-fill-regexp-in-paragraphs-a.patch --]
[-- Type: text/x-diff, Size: 5434 bytes --]

From d460b8048d7b3b308cd93794b1de46837438a8e6 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <n.goaziou@gmail.com>
Date: Sat, 27 Jul 2013 22:02:45 +0200
Subject: [PATCH] Add support for `adaptive-fill-regexp' in paragraphs and
 comments

* lisp/org.el (org-adaptive-fill-function, org-fill-paragraph): Add
  support for `adaptive-fill-regexp' in paragraphs and comments.
* testing/lisp/test-org.el: Add test.
---
 lisp/org.el              | 43 ++++++++++++++++++++++++++++++-------------
 testing/lisp/test-org.el | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 13 deletions(-)

diff --git a/lisp/org.el b/lisp/org.el
index 2f619cc..c852550 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -22179,7 +22179,15 @@ meant to be filled."
 	      (post-affiliated (org-element-property :post-affiliated element)))
 	 (unless (and post-affiliated (< p post-affiliated))
 	   (case type
-	     (comment (looking-at "[ \t]*# ?") (match-string 0))
+	     (comment
+	      (save-excursion
+		(beginning-of-line)
+		(looking-at "[ \t]*# ?")
+		(goto-char (match-end 0))
+		(let ((comment-prefix (match-string 0)))
+		  (if (looking-at adaptive-fill-regexp)
+		      (concat comment-prefix (match-string 0))
+		    comment-prefix))))
 	     (footnote-definition "")
 	     ((item plain-list)
 	      (make-string (org-list-item-body-column
@@ -22188,15 +22196,19 @@ meant to be filled."
 			   ? ))
 	     (paragraph
 	      ;; Fill prefix is usually the same as the current line,
-	      ;; except if the paragraph is at the beginning of an item.
+	      ;; except if the paragraph is at the beginning of an
+	      ;; item.  For convenience, if `adaptive-fill-regexp'
+	      ;; matches, use it.
 	      (let ((parent (org-element-property :parent element)))
-		(cond ((eq (org-element-type parent) 'item)
-		       (make-string (org-list-item-body-column
-				     (org-element-property :begin parent))
-				    ? ))
-		      ((save-excursion (beginning-of-line) (looking-at "[ \t]+"))
-		       (match-string 0))
-		      (t  ""))))
+		(save-excursion
+		  (beginning-of-line)
+		  (cond ((eq (org-element-type parent) 'item)
+			 (make-string (org-list-item-body-column
+				       (org-element-property :begin parent))
+				      ? ))
+			((looking-at adaptive-fill-regexp) (match-string 0))
+			((looking-at "[ \t]+") (match-string 0))
+			(t  "")))))
 	     (comment-block
 	      ;; Only fill contents if P is within block boundaries.
 	      (let* ((cbeg (save-excursion (goto-char post-affiliated)
@@ -22341,10 +22353,15 @@ a footnote definition, try to fill the first paragraph within."
 			      (line-end-position)))))
 		 ;; Do not fill comments when at a blank line or at
 		 ;; affiliated keywords.
-		 (let ((fill-prefix (save-excursion
-				      (beginning-of-line)
-				      (looking-at "[ \t]*#")
-				      (concat (match-string 0) " "))))
+		 (let ((fill-prefix
+			(save-excursion
+			  (beginning-of-line)
+			  (looking-at "[ \t]*#")
+			  (let ((comment-prefix (match-string 0)))
+			    (goto-char (match-end 0))
+			    (if (looking-at adaptive-fill-regexp)
+				(concat comment-prefix (match-string 0))
+			      (concat comment-prefix " "))))))
 		   (when (> end begin)
 		     (save-excursion
 		       (fill-region-as-paragraph begin end justify))))))
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index 504defa..517d0d1 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -176,6 +176,14 @@
 	      (narrow-to-region 1 8)
 	      (org-fill-paragraph)
 	      (buffer-string)))))
+  ;; Handle `adaptive-fill-regexp' in paragraphs.
+  (should
+   (equal "> a b"
+	  (org-test-with-temp-text "> a\n> b"
+	    (let ((fill-column 5)
+		  (adaptive-fill-regexp "[ \t]*>+[ \t]*"))
+	      (org-fill-paragraph)
+	      (buffer-string)))))
   ;; Special case: Fill first paragraph when point is at an item or
   ;; a plain-list or a footnote reference.
   (should
@@ -225,6 +233,14 @@
 	    (let ((fill-column 20))
 	      (org-fill-paragraph)
 	      (buffer-string)))))
+  ;; Handle `adaptive-fill-regexp' in comments.
+  (should
+   (equal "# > a b"
+	  (org-test-with-temp-text "# > a\n# > b"
+	    (let ((fill-column 20)
+		  (adaptive-fill-regexp "[ \t]*>+[ \t]*"))
+	      (org-fill-paragraph)
+	      (buffer-string)))))
   ;; Do nothing at affiliated keywords.
   (org-test-with-temp-text "#+NAME: para\nSome\ntext."
     (let ((fill-column 20))
@@ -255,6 +271,15 @@
 	      (end-of-line)
 	      (org-auto-fill-function)
 	      (buffer-string)))))
+  ;; Auto fill paragraph when `adaptive-fill-regexp' matches.
+  (should
+   (equal "> 12345\n> 7890"
+	  (org-test-with-temp-text "> 12345 7890"
+	    (let ((fill-column 5)
+		  (adaptive-fill-regexp "[ \t]*>+[ \t]*"))
+	      (end-of-line)
+	      (org-auto-fill-function)
+	      (buffer-string)))))
   ;; Auto fill comments.
   (should
    (equal "  # 12345\n  # 7890"
@@ -263,6 +288,15 @@
 	      (end-of-line)
 	      (org-auto-fill-function)
 	      (buffer-string)))))
+  ;; Auto fill comments when `adaptive-fill-regexp' matches.
+  (should
+   (equal "  # > 12345\n  # > 7890"
+	  (org-test-with-temp-text "  # > 12345 7890"
+	    (let ((fill-column 10)
+		  (adaptive-fill-regexp "[ \t]*>+[ \t]*"))
+	      (end-of-line)
+	      (org-auto-fill-function)
+	      (buffer-string)))))
   ;; A hash within a line isn't a comment.
   (should-not
    (equal "12345 # 7890\n# 1"
-- 
1.8.3.4


  reply	other threads:[~2013-07-27 20:45 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-27 18:47 [BUG] `org-fill-paragraph' doesn't use `fill-prefix' Daniel Hackney
2013-07-27 20:45 ` Nicolas Goaziou [this message]
2013-07-27 21:15   ` Daniel Hackney
2013-07-27 23:16   ` Daniel Hackney
2013-07-28  8:20     ` Nicolas Goaziou

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://www.orgmode.org/

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

  git send-email \
    --in-reply-to=874nbf3f6q.fsf@gmail.com \
    --to=n.goaziou@gmail.com \
    --cc=dan@haxney.org \
    --cc=emacs-orgmode@gnu.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://git.savannah.gnu.org/cgit/emacs/org-mode.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).