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:
parent
3d9ce27e7b
commit
833815e8a7
3 changed files with 53 additions and 106 deletions
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue