changeset 44802:cb8f23e350ff

(c-mask-comment): A better way to ensure point doesn't move around unexpectedly. Also handles the paragraph fill case.
author Martin Stjernholm <mast@lysator.liu.se>
date Wed, 24 Apr 2002 01:27:15 +0000
parents b986daa6d686
children de50fca9a8aa
files lisp/progmodes/cc-cmds.el
diffstat 1 files changed, 25 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/cc-cmds.el	Wed Apr 24 00:58:45 2002 +0000
+++ b/lisp/progmodes/cc-cmds.el	Wed Apr 24 01:27:15 2002 +0000
@@ -2761,10 +2761,14 @@
 		  '("" . 0))))))
     ))
 
-(defun c-mask-comment (fill-mode apply-outside-literal fun &rest args)
+(defun c-mask-comment (fill-paragraph apply-outside-literal fun &rest args)
   ;; Calls FUN with ARGS ar arguments.  If point is inside a comment,
   ;; the comment starter and ender are masked and the buffer is
   ;; narrowed to make it look like a normal paragraph during the call.
+  ;;
+  ;; FILL-PARAGRAPH is non-nil if called for paragraph filling.  The
+  ;; position of point is then less significant when doing masking and
+  ;; narrowing.
   (let (fill
 	;; beg and end limits the region to narrow.  end is a marker.
 	beg end
@@ -2790,7 +2794,7 @@
       ;; Widen to catch comment limits correctly.
       (widen)
       (unless c-lit-limits
-	(setq c-lit-limits (c-literal-limits nil fill-mode)))
+	(setq c-lit-limits (c-literal-limits nil fill-paragraph)))
       (setq c-lit-limits (c-collect-line-comments c-lit-limits))
       (unless c-lit-type
 	(setq c-lit-type (c-literal-type c-lit-limits))))
@@ -2840,8 +2844,8 @@
 						 "\\)\\*/"))
 			     (eq (cdr c-lit-limits) (match-end 0))
 			     ;; Leave the comment ender on its own line.
-			     (set-marker end (max (point) here))))
-		(when fill-mode
+			     (set-marker end (point))))
+		(when fill-paragraph
 		  ;; The comment ender should hang.  Replace all cruft
 		  ;; between it and the last word with one or two 'x'
 		  ;; and include it in the region.  We'll change them
@@ -2900,13 +2904,11 @@
 	      ;; The region includes the comment starter.
 	      (save-excursion
 		(goto-char (car c-lit-limits))
-		(when (and (looking-at comment-start-skip)
-			   (> here (match-end 0)))
-		  (if (eq (match-end 0) (c-point 'eol))
-		      ;; Begin with the next line.
-		      (setq beg (c-point 'bonl))
-		    ;; Fake the fill prefix in the first line.
-		    (setq tmp-pre t))))))
+		(if (looking-at (concat "\\(" comment-start-skip "\\)$"))
+		    ;; Begin with the next line.
+		    (setq beg (c-point 'bonl))
+		  ;; Fake the fill prefix in the first line.
+		  (setq tmp-pre t)))))
 	   ((eq c-lit-type 'string)	; String.
 	    (save-excursion
 	      (when (>= end (cdr c-lit-limits))
@@ -2984,24 +2986,24 @@
 					      ""))))
 			   (car (or fill (c-guess-fill-prefix
 					  c-lit-limits c-lit-type))))))
-		    ;; Don't remember why I added this, but it doesn't
-		    ;; work correctly since `here' can point anywhere
-		    ;; after the deletes and inserts above.
-		    ;(point-rel (cond ((< here beg) (- here beg))
-		    ;		       ((> here end) (- here end))))
-		    )
+		    ;; Save the relative position of point if it's
+		    ;; outside the region we're going to narrow.  Want
+		    ;; to restore it in that case, but otherwise it
+		    ;; should be moved according to the called
+		    ;; function.
+		    (point-rel (cond ((< (point) beg) (- (point) beg))
+				     ((> (point) end) (- (point) end)))))
 		;; Preparations finally done! Now we can call the
 		;; actual function.
 		(prog1
 		    (save-restriction
 		      (narrow-to-region beg end)
 		      (apply fun args))
-		  ;(if point-rel
-		  ;    ;; Restore point if it was outside the region.
-		  ;    (if (< point-rel 0)
-		  ;	  (goto-char (+ beg point-rel))
-		  ;	(goto-char (+ end point-rel))))
-		  ))
+		  (if point-rel
+		      ;; Restore point if it was outside the region.
+		      (if (< point-rel 0)
+			  (goto-char (+ beg point-rel))
+			(goto-char (+ end point-rel))))))
 	    (when apply-outside-literal
 	      (apply fun args))))
       (when (consp tmp-pre)