Mercurial > emacs
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)