1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 14:30:50 -08:00

(lisp-fill-paragraph): Use fill-comment-paragraph.

This commit is contained in:
Stefan Monnier 2002-11-03 03:46:56 +00:00
parent 3d9ce27e7b
commit 833815e8a7
3 changed files with 53 additions and 106 deletions

View file

@ -1060,99 +1060,23 @@ If any of the current line is a comment, fill the comment or the
paragraph of it that point is in, preserving the comment's indentation
and initial semicolons."
(interactive "P")
(let (
;; Non-nil if the current line contains a comment.
has-comment
;; Non-nil if the current line contains code and a comment.
has-code-and-comment
;; If has-comment, the appropriate fill-prefix for the comment.
comment-fill-prefix
)
;; Figure out what kind of comment we are looking at.
(save-excursion
(beginning-of-line)
(cond
;; A line with nothing but a comment on it?
((looking-at "[ \t]*;[; \t]*")
(setq has-comment t
comment-fill-prefix (match-string 0)))
;; A line with some code, followed by a comment? Remember that the
;; semi which starts the comment shouldn't be part of a string or
;; character.
((let ((state (syntax-ppss (line-end-position))))
(when (nth 4 state)
(goto-char (nth 8 state))
(looking-at ";+[\t ]*")))
(setq has-comment t has-code-and-comment t)
(setq comment-fill-prefix
(concat (make-string (/ (current-column) tab-width) ?\t)
(make-string (% (current-column) tab-width) ?\ )
(match-string 0))))))
(if (not has-comment)
;; `paragraph-start' is set here (not in the buffer-local
;; variable so that `forward-paragraph' et al work as
;; expected) so that filling (doc) strings works sensibly.
;; Adding the opening paren to avoid the following sexp being
;; filled means that sexps generally aren't filled as normal
;; text, which is probably sensible. The `;' and `:' stop the
;; filled para at following comment lines and keywords
;; (typically in `defcustom').
(let ((paragraph-start (concat paragraph-start
"\\|\\s-*[\(;:\"]"))
;; Avoid filling the first line of docstring.
(paragraph-separate
(concat paragraph-separate "\\|\\s-*\".*\\.$")))
(fill-paragraph justify))
;; Narrow to include only the comment, and then fill the region.
(save-excursion
(save-restriction
(beginning-of-line)
(narrow-to-region
;; Find the first line we should include in the region to fill.
(save-excursion
(while (and (zerop (forward-line -1))
(looking-at "[ \t]*;")))
;; We may have gone too far. Go forward again.
(or (looking-at ".*;")
(forward-line 1))
(point))
;; Find the beginning of the first line past the region to fill.
(save-excursion
(while (progn (forward-line 1)
(looking-at "[ \t]*;")))
(point)))
;; Lines with only semicolons on them can be paragraph boundaries.
(let* ((paragraph-separate (concat paragraph-separate "\\|[ \t;]*$"))
(paragraph-ignore-fill-prefix nil)
(fill-prefix comment-fill-prefix)
(after-line (if has-code-and-comment
(line-beginning-position 2)))
(end (progn
(forward-paragraph)
(or (bolp) (newline 1))
(point)))
;; If this comment starts on a line with code,
;; include that like in the filling.
(beg (progn (backward-paragraph)
(if (eq (point) after-line)
(forward-line -1))
(point))))
(fill-region-as-paragraph beg end
justify nil
(save-excursion
(goto-char beg)
(if (looking-at fill-prefix)
nil
(re-search-forward comment-start-skip))))))))
t))
(or (fill-comment-paragraph justify)
;; `paragraph-start' is set here (not in the buffer-local
;; variable so that `forward-paragraph' et al work as
;; expected) so that filling (doc) strings works sensibly.
;; Adding the opening paren to avoid the following sexp being
;; filled means that sexps generally aren't filled as normal
;; text, which is probably sensible. The `;' and `:' stop the
;; filled para at following comment lines and keywords
;; (typically in `defcustom').
(let ((paragraph-start (concat paragraph-start
"\\|\\s-*[\(;:\"]"))
;; Avoid filling the first line of docstring.
(paragraph-separate
(concat paragraph-separate "\\|\\s-*\".*\\.$")))
(fill-paragraph justify))
;; Never return nil.
t))
(defun indent-code-rigidly (start end arg &optional nochange-regexp)
"Indent all lines of code, starting in the region, sideways by ARG columns.