Function: opascal-fill-comment
opascal-fill-comment is an interactive and byte-compiled function
defined in opascal.el.gz.
Signature
(opascal-fill-comment)
Documentation
Fill the text of the current comment, according to fill-column.
An error is raised if not in a comment.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/opascal.el.gz
(defun opascal-fill-comment ()
"Fill the text of the current comment, according to `fill-column'.
An error is raised if not in a comment."
(interactive)
(save-excursion
(save-restriction
(let* ((comment (opascal-current-token))
(comment-kind (opascal-token-kind comment)))
(if (not (memq comment-kind opascal-comments))
(error "Not in a comment")
(let* ((start-comment (opascal-comment-block-start comment))
(end-comment (opascal-comment-block-end comment))
;; FIXME: Don't abuse global variables like `comment-end/start'.
(comment-start (opascal-token-start start-comment))
(comment-end (opascal-token-end end-comment))
(content-start (opascal-comment-content-start start-comment))
(content-indent (opascal-column-of content-start))
(content-prefix (make-string content-indent ?\s))
(content-prefix-re opascal-leading-spaces-re)
(p nil)
(marked-point (point-marker))) ; Maintain our position reliably.
(when (eq 'comment-single-line comment-kind)
;; // style comments need more work.
(setq content-prefix
(let ((comment-indent (opascal-column-of comment-start)))
(concat (make-string comment-indent ?\s) "//"
(make-string (- content-indent comment-indent 2)
?\s)))
content-prefix-re (concat opascal-leading-spaces-re
"//"
opascal-spaces-re)
comment-end (if (opascal-is-literal-end comment-end)
;; Don't include the trailing newline.
(1- comment-end)
comment-end)))
;; Advance our marked point after inserted spaces.
(set-marker-insertion-type marked-point t)
;; Ensure we can modify the buffer
(goto-char content-start)
(insert " ")
(delete-char -1)
(narrow-to-region content-start comment-end)
;; Strip off the comment prefixes
(setq p (point-min))
(while (when (< p (point-max))
(goto-char p)
(re-search-forward content-prefix-re nil t))
(replace-match "" nil nil)
(setq p (1+ (point))))
;; add an extra line to prevent the fill from doing it for us.
(goto-char (point-max))
(insert "\n")
;; Fill the comment contents.
(let ((fill-column (- fill-column content-indent)))
(fill-region (point-min) (point-max)))
(goto-char (point-max))
(delete-char -1)
;; Restore comment prefixes.
(goto-char (point-min))
(end-of-line) ; Don't reset the first line.
(setq p (point))
(while (when (< p (point-max))
(goto-char p)
(re-search-forward "^" nil t))
(replace-match content-prefix nil nil)
(setq p (1+ (point))))
(setq comment-end (point-max))
(widen)
;; Restore our position
(goto-char marked-point)
(set-marker marked-point nil)))))))