summaryrefslogtreecommitdiff
path: root/lisp/progmodes/c-mode.el
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-01-29 01:27:32 +0000
committerRichard M. Stallman <rms@gnu.org>1994-01-29 01:27:32 +0000
commit76a9952753cae57023779b76a5a3d705ad4bc68f (patch)
treebf885e3220005604206ca133df81f24e12e9140c /lisp/progmodes/c-mode.el
parent0d8d203b374597fcb1276a6d9a671b9a1f33020c (diff)
downloademacs-76a9952753cae57023779b76a5a3d705ad4bc68f.tar.gz
(c-fill-paragraph): Handle C++ mode.
Diffstat (limited to 'lisp/progmodes/c-mode.el')
-rw-r--r--lisp/progmodes/c-mode.el263
1 files changed, 153 insertions, 110 deletions
diff --git a/lisp/progmodes/c-mode.el b/lisp/progmodes/c-mode.el
index 2ffb2b82294..99ba7184c86 100644
--- a/lisp/progmodes/c-mode.el
+++ b/lisp/progmodes/c-mode.el
@@ -286,73 +286,11 @@ preserving the comment indentation or line-starting decorations."
(skip-chars-forward " \t\n")
(and (looking-at comment-start-skip)
(setq comment-start-place (point))))))
- (if (or first-line
- ;; t if we enter a comment between start of function and this line.
- (eq (calculate-c-indent) t)
- ;; t if this line contains a comment starter.
- (setq first-line
- (save-excursion
- (beginning-of-line)
- (prog1
- (re-search-forward comment-start-skip
- (save-excursion (end-of-line)
- (point))
- t)
- (setq comment-start-place (point))))))
- ;; Inside a comment: fill one comment paragraph.
- (let ((fill-prefix
- ;; The prefix for each line of this paragraph
- ;; is the appropriate part of the start of this line,
- ;; up to the column at which text should be indented.
- (save-excursion
- (beginning-of-line)
- (if (looking-at "[ \t]*/\\*.*\\*/")
- (progn (re-search-forward comment-start-skip)
- (make-string (current-column) ?\ ))
- (if first-line (forward-line 1))
-
- (let ((line-width (progn (end-of-line) (current-column))))
- (beginning-of-line)
- (prog1
- (buffer-substring
- (point)
-
- ;; How shall we decide where the end of the
- ;; fill-prefix is?
- ;; calculate-c-indent-within-comment bases its value
- ;; on the indentation of previous lines; if they're
- ;; indented specially, it could return a column
- ;; that's well into the current line's text. So
- ;; we'll take at most that many space, tab, or *
- ;; characters, and use that as our fill prefix.
- (let ((max-prefix-end
- (progn
- (move-to-column
- (calculate-c-indent-within-comment t)
- t)
- (point))))
- (beginning-of-line)
- (skip-chars-forward " \t*" max-prefix-end)
- (point)))
-
- ;; If the comment is only one line followed by a blank
- ;; line, calling move-to-column above may have added
- ;; some spaces and tabs to the end of the line; the
- ;; fill-paragraph function will then delete it and the
- ;; newline following it, so we'll lose a blank line
- ;; when we shouldn't. So delete anything
- ;; move-to-column added to the end of the line. We
- ;; record the line width instead of the position of the
- ;; old line end because move-to-column might break a
- ;; tab into spaces, and the new characters introduced
- ;; there shouldn't be deleted.
-
- ;; If you can see a better way to do this, please make
- ;; the change. This seems very messy to me.
- (delete-region (progn (move-to-column line-width)
- (point))
- (progn (end-of-line) (point))))))))
-
+ (if (and (eq major-mode 'c++-mode)
+ (save-excursion
+ (beginning-of-line)
+ (looking-at ".*//")))
+ (let (fill-prefix
(paragraph-start
;; Lines containing just a comment start or just an end
;; should not be filled into paragraphs they are next to.
@@ -362,49 +300,154 @@ preserving the comment indentation or line-starting decorations."
(paragraph-separate
(concat
paragraph-separate
- "\\|^[ \t]*/\\*[ \t]*$\\|^[ \t]*\\*/[ \t]*$\\|^[ \t/*]*$"))
- (chars-to-delete 0))
- (save-restriction
- ;; Don't fill the comment together with the code following it.
- ;; So temporarily exclude everything before the comment start,
- ;; and everything after the line where the comment ends.
- ;; If comment-start-place is non-nil, the comment starter is there.
- ;; Otherwise, point is inside the comment.
- (narrow-to-region (save-excursion
- (if comment-start-place
- (goto-char comment-start-place)
- (search-backward "/*"))
- ;; Protect text before the comment start
- ;; by excluding it. Add spaces to bring back
- ;; proper indentation of that point.
- (let ((column (current-column)))
- (prog1 (point)
- (setq chars-to-delete column)
- (insert-char ?\ column))))
- (save-excursion
- (if comment-start-place
- (goto-char (+ comment-start-place 2)))
- (search-forward "*/" nil 'move)
- (forward-line 1)
- (point)))
-
- (fill-paragraph arg)
- (save-excursion
- ;; Delete the chars we inserted to avoid clobbering
- ;; the stuff before the comment start.
- (goto-char (point-min))
- (if (> chars-to-delete 0)
- (delete-region (point) (+ (point) chars-to-delete)))
- ;; Find the comment ender (should be on last line of buffer,
- ;; given the narrowing) and don't leave it on its own line.
- (goto-char (point-max))
- (forward-line -1)
- (search-forward "*/" nil 'move)
- (beginning-of-line)
- (if (looking-at "[ \t]*\\*/")
- (delete-indentation)))))
- ;; Outside of comments: do ordinary filling.
- (fill-paragraph arg))))
+ "\\|^[ \t]*/\\*[ \t]*$\\|^[ \t]*\\*/[ \t]*$\\|^[ \t/*]*$")))
+ (save-excursion
+ (beginning-of-line)
+ ;; Move up to first line of this comment.
+ (while (and (not (bobp)) (looking-at "[ \t]*//"))
+ (forward-line -1))
+ (if (not (looking-at ".*//"))
+ (forward-line 1))
+ ;; Find the comment start in this line.
+ (re-search-forward "[ \t]*//[ \t]*")
+ ;; Set the fill-prefix to be what all lines except the first
+ ;; should start with.
+ (let ((endcol (current-column)))
+ (skip-chars-backward " \t")
+ (setq fill-prefix
+ (concat (make-string (- (current-column) 2) ?\ )
+ "//"
+ (make-string (- endcol (current-column)) ?\ ))))
+ (save-restriction
+ ;; Narrow down to just the lines of this comment.
+ (narrow-to-region (point)
+ (save-excursion
+ (forward-line 1)
+ (while (looking-at "[ \t]*//"))
+ (forward-line 1))
+ (point)))
+ (insert fill-prefix)
+ (fill-paragraph arg)
+ (delete-region (point-min)
+ (+ (point-min) (length fill-prefix))))))
+ (if (or first-line
+ ;; t if we enter a comment between start of function and this line.
+ (eq (calculate-c-indent) t)
+ ;; t if this line contains a comment starter.
+ (setq first-line
+ (save-excursion
+ (beginning-of-line)
+ (prog1
+ (re-search-forward comment-start-skip
+ (save-excursion (end-of-line)
+ (point))
+ t)
+ (setq comment-start-place (point))))))
+ ;; Inside a comment: fill one comment paragraph.
+ (let ((fill-prefix
+ ;; The prefix for each line of this paragraph
+ ;; is the appropriate part of the start of this line,
+ ;; up to the column at which text should be indented.
+ (save-excursion
+ (beginning-of-line)
+ (if (looking-at "[ \t]*/\\*.*\\*/")
+ (progn (re-search-forward comment-start-skip)
+ (make-string (current-column) ?\ ))
+ (if first-line (forward-line 1))
+
+ (let ((line-width (progn (end-of-line) (current-column))))
+ (beginning-of-line)
+ (prog1
+ (buffer-substring
+ (point)
+
+ ;; How shall we decide where the end of the
+ ;; fill-prefix is?
+ ;; calculate-c-indent-within-comment bases its value
+ ;; on the indentation of previous lines; if they're
+ ;; indented specially, it could return a column
+ ;; that's well into the current line's text. So
+ ;; we'll take at most that many space, tab, or *
+ ;; characters, and use that as our fill prefix.
+ (let ((max-prefix-end
+ (progn
+ (move-to-column
+ (calculate-c-indent-within-comment t)
+ t)
+ (point))))
+ (beginning-of-line)
+ (skip-chars-forward " \t*" max-prefix-end)
+ (point)))
+
+ ;; If the comment is only one line followed by a blank
+ ;; line, calling move-to-column above may have added
+ ;; some spaces and tabs to the end of the line; the
+ ;; fill-paragraph function will then delete it and the
+ ;; newline following it, so we'll lose a blank line
+ ;; when we shouldn't. So delete anything
+ ;; move-to-column added to the end of the line. We
+ ;; record the line width instead of the position of the
+ ;; old line end because move-to-column might break a
+ ;; tab into spaces, and the new characters introduced
+ ;; there shouldn't be deleted.
+
+ ;; If you can see a better way to do this, please make
+ ;; the change. This seems very messy to me.
+ (delete-region (progn (move-to-column line-width)
+ (point))
+ (progn (end-of-line) (point))))))))
+
+ (paragraph-start
+ ;; Lines containing just a comment start or just an end
+ ;; should not be filled into paragraphs they are next to.
+ (concat
+ paragraph-start
+ "\\|^[ \t]*/\\*[ \t]*$\\|^[ \t]*\\*/[ \t]*$\\|^[ \t/*]*$"))
+ (paragraph-separate
+ (concat
+ paragraph-separate
+ "\\|^[ \t]*/\\*[ \t]*$\\|^[ \t]*\\*/[ \t]*$\\|^[ \t/*]*$"))
+ (chars-to-delete 0))
+ (save-restriction
+ ;; Don't fill the comment together with the code following it.
+ ;; So temporarily exclude everything before the comment start,
+ ;; and everything after the line where the comment ends.
+ ;; If comment-start-place is non-nil, the comment starter is there.
+ ;; Otherwise, point is inside the comment.
+ (narrow-to-region (save-excursion
+ (if comment-start-place
+ (goto-char comment-start-place)
+ (search-backward "/*"))
+ ;; Protect text before the comment start
+ ;; by excluding it. Add spaces to bring back
+ ;; proper indentation of that point.
+ (let ((column (current-column)))
+ (prog1 (point)
+ (setq chars-to-delete column)
+ (insert-char ?\ column))))
+ (save-excursion
+ (if comment-start-place
+ (goto-char (+ comment-start-place 2)))
+ (search-forward "*/" nil 'move)
+ (forward-line 1)
+ (point)))
+ (fill-paragraph arg)
+ (save-excursion
+ ;; Delete the chars we inserted to avoid clobbering
+ ;; the stuff before the comment start.
+ (goto-char (point-min))
+ (if (> chars-to-delete 0)
+ (delete-region (point) (+ (point) chars-to-delete)))
+ ;; Find the comment ender (should be on last line of buffer,
+ ;; given the narrowing) and don't leave it on its own line.
+ (goto-char (point-max))
+ (forward-line -1)
+ (search-forward "*/" nil 'move)
+ (beginning-of-line)
+ (if (looking-at "[ \t]*\\*/")
+ (delete-indentation)))))
+ ;; Outside of comments: do ordinary filling.
+ (fill-paragraph arg)))))
(defun electric-c-brace (arg)
"Insert character and correct line's indentation."