浏览代码

Fix filling in in a narrowed buffer

* lisp/org.el (org-fill-paragraph): Fix filling in a narrowed buffer.
(org-fill-context-prefix): Fill prefix doesn't depend on current
narrowing.
* testing/lisp/test-org.el: Add test.
Nicolas Goaziou 12 年之前
父节点
当前提交
a3c4e10ac1
共有 2 个文件被更改,包括 74 次插入58 次删除
  1. 66 58
      lisp/org.el
  2. 8 0
      testing/lisp/test-org.el

+ 66 - 58
lisp/org.el

@@ -20962,50 +20962,50 @@ hierarchy of headlines by UP levels before marking the subtree."
   "Compute a fill prefix for the line at point P.
 Return fill prefix, as a string, or nil if current line isn't
 meant to be filled."
-  (unless (and (derived-mode-p 'message-mode) (not (message-in-body-p)))
-    ;; FIXME: Prevent an error for users who forgot to make autoloads?
-    ;; See also `org-fill-paragraph', which has the same.
-    (require 'org-element)
-    ;; FIXME: This is really the job of orgstruct++-mode
-    (save-excursion
-      (goto-char p)
-      (beginning-of-line)
-      (let* ((element (org-element-at-point))
-	     (type (org-element-type element))
-	     (post-affiliated
-	      (progn
-		(goto-char (org-element-property :begin element))
-		(while (looking-at org-element--affiliated-re) (forward-line))
-		(point))))
-	(unless (< p post-affiliated)
-	  (case type
-	    (comment (looking-at "[ \t]*# ?") (match-string 0))
-	    (footnote-definition "")
-	    ((item plain-list)
-	     (make-string (org-list-item-body-column
-			   (org-element-property :begin element))
-			  ? ))
-	    (paragraph
-	     ;; Fill prefix is usually the same as the current line,
-	     ;; except if the paragraph is at the beginning of an item.
-	     (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))
-				   ? ))
-		     ((looking-at "\\s-+") (match-string 0))
-		     (t  ""))))
-	    ((comment-block verse-block)
-	     ;; Only fill contents if P is within block boundaries.
-	     (let* ((cbeg (save-excursion (goto-char post-affiliated)
-					  (forward-line)
-					  (point)))
-		    (cend (save-excursion
-			    (goto-char (org-element-property :end element))
-			    (skip-chars-backward " \r\t\n")
-			    (line-beginning-position))))
-	       (when (and (>= p cbeg) (< p cend))
-		 (if (looking-at "\\s-+") (match-string 0) ""))))))))))
+  (org-with-wide-buffer
+   (unless (and (derived-mode-p 'message-mode) (not (message-in-body-p)))
+     ;; FIXME: Prevent an error for users who forgot to make autoloads?
+     ;; See also `org-fill-paragraph', which has the same.
+     (require 'org-element)
+     ;; FIXME: This is really the job of orgstruct++-mode
+     (goto-char p)
+     (beginning-of-line)
+     (let* ((element (org-element-at-point))
+	    (type (org-element-type element))
+	    (post-affiliated
+	     (progn
+	       (goto-char (org-element-property :begin element))
+	       (while (looking-at org-element--affiliated-re) (forward-line))
+	       (point))))
+       (unless (< p post-affiliated)
+	 (case type
+	   (comment (looking-at "[ \t]*# ?") (match-string 0))
+	   (footnote-definition "")
+	   ((item plain-list)
+	    (make-string (org-list-item-body-column
+			  (org-element-property :begin element))
+			 ? ))
+	   (paragraph
+	    ;; Fill prefix is usually the same as the current line,
+	    ;; except if the paragraph is at the beginning of an item.
+	    (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))
+				  ? ))
+		    ((looking-at "\\s-+") (match-string 0))
+		    (t  ""))))
+	   ((comment-block verse-block)
+	    ;; Only fill contents if P is within block boundaries.
+	    (let* ((cbeg (save-excursion (goto-char post-affiliated)
+					 (forward-line)
+					 (point)))
+		   (cend (save-excursion
+			   (goto-char (org-element-property :end element))
+			   (skip-chars-backward " \r\t\n")
+			   (line-beginning-position))))
+	      (when (and (>= p cbeg) (< p cend))
+		(if (looking-at "\\s-+") (match-string 0) ""))))))))))
 
 (defvar org-element-all-objects)         ; From org-element.el
 (defun org-fill-paragraph (&optional justify)
@@ -21029,10 +21029,12 @@ a footnote definition, try to fill the first paragraph within."
 	   (or (not (message-in-body-p))
 	       (save-excursion (move-beginning-of-line 1)
 			       (looking-at "^>+ "))))
-      (let ((fill-paragraph-function (cadadr (assoc 'fill-paragraph-function org-fb-vars)))
+      (let ((fill-paragraph-function
+	     (cadadr (assoc 'fill-paragraph-function org-fb-vars)))
 	    (fill-prefix (cadadr (assoc 'fill-prefix org-fb-vars)))
 	    (paragraph-start (cadadr (assoc 'paragraph-start org-fb-vars)))
-	    (paragraph-separate (cadadr (assoc 'paragraph-separate org-fb-vars))))
+	    (paragraph-separate
+	     (cadadr (assoc 'paragraph-separate org-fb-vars))))
 	(fill-paragraph))
     (save-excursion
       ;; Move to end of line in order to get the first paragraph within
@@ -21051,8 +21053,10 @@ a footnote definition, try to fill the first paragraph within."
 	     t)
 	    ;; Elements that may contain `line-break' type objects.
 	    ((paragraph verse-block)
-	     (let ((beg (org-element-property :contents-begin element))
-		   (end (org-element-property :contents-end element))
+	     (let ((beg (max (point-min)
+			     (org-element-property :contents-begin element)))
+		   (end (min (point-max)
+			     (org-element-property :contents-end element)))
 		   (type (org-element-type element)))
 	       ;; Do nothing if point is at an affiliated keyword or at
 	       ;; verse block markers.
@@ -21062,15 +21066,16 @@ a footnote definition, try to fill the first paragraph within."
 		 ;; At a verse block, first narrow to current "paragraph"
 		 ;; and set current element to that paragraph.
 		 (save-restriction
+		   (narrow-to-region beg end)
 		   (when (eq type 'verse-block)
-		     (narrow-to-region beg end)
 		     (save-excursion
 		       (let ((bol-pos (point-at-bol)))
 			 (re-search-backward "^[ \t]*$" nil 'm)
 			 (unless (or (bobp) (= (point-at-bol) bol-pos))
 			   (forward-line))
 			 (setq element (org-element-paragraph-parser end)
-			       beg (org-element-property :contents-begin element)
+			       beg (org-element-property
+				    :contents-begin element)
 			       end (org-element-property
 				    :contents-end element)))))
 		   ;; Fill paragraph, taking line breaks into consideration.
@@ -21088,12 +21093,13 @@ a footnote definition, try to fill the first paragraph within."
 		      ;; in the current paragraph.  Add paragraph beginning
 		      ;; to include first slice.
 		      (nreverse
-		       (cons beg
-			     (org-element-map
-			      (org-element--parse-objects
-			       beg end nil org-element-all-objects)
-			      'line-break
-			      (lambda (lb) (org-element-property :end lb))))))))
+		       (cons
+			beg
+			(org-element-map
+			 (org-element--parse-objects
+			  beg end nil org-element-all-objects)
+			 'line-break
+			 (lambda (lb) (org-element-property :end lb))))))))
 		 t)))
 	    ;; Contents of `comment-block' type elements should be filled as
 	    ;; plain text.
@@ -21103,7 +21109,8 @@ a footnote definition, try to fill the first paragraph within."
 		 (fill-region-as-paragraph
 		  (progn
 		    (goto-char (org-element-property :begin element))
-		    (while (looking-at org-element--affiliated-re) (forward-line))
+		    (while (looking-at org-element--affiliated-re)
+		      (forward-line))
 		    (forward-line)
 		    (point))
 		  (progn
@@ -21118,7 +21125,8 @@ a footnote definition, try to fill the first paragraph within."
 		 (fill-region-as-paragraph
 		  (progn
 		    (goto-char (org-element-property :begin element))
-		    (while (looking-at org-element--affiliated-re) (forward-line))
+		    (while (looking-at org-element--affiliated-re)
+		      (forward-line))
 		    (point))
 		  (progn
 		    (goto-char (org-element-property :end element))

+ 8 - 0
testing/lisp/test-org.el

@@ -160,6 +160,14 @@ http://article.gmane.org/gmane.emacs.orgmode/21459/"
 	      (end-of-line)
 	      (org-fill-paragraph)
 	      (buffer-string)))))
+  ;; Correctly fill an element in a narrowed buffer.
+  (should
+   (equal "01234\n6"
+	  (org-test-with-temp-text "01234 6789"
+	    (let ((fill-column 5))
+	      (narrow-to-region 1 8)
+	      (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