Better C-style indentation
This commit is contained in:
64
elisp/c-comments.el
Normal file
64
elisp/c-comments.el
Normal file
@ -0,0 +1,64 @@
|
||||
;;; c-comments.el --- Functions for working with C-style comments.-*- lexical-binding: t -*-
|
||||
;;; Commentary:
|
||||
;;; Code:
|
||||
|
||||
(defun c-comments-bounds-at-point ()
|
||||
"Return the bounds of the multi-line comment around point."
|
||||
(let* ((syntax-info (syntax-ppss))
|
||||
(in-comment (nth 4 syntax-info))
|
||||
(is-multiline (and in-comment
|
||||
(not (nth 7 syntax-info)))))
|
||||
(cond
|
||||
(is-multiline
|
||||
(let ((start (save-excursion
|
||||
(end-of-line)
|
||||
(search-backward "/*" nil t)))
|
||||
(end (save-excursion
|
||||
(beginning-of-line)
|
||||
(search-forward "*/" nil t))))
|
||||
(when (and start
|
||||
(>= (point) start)
|
||||
(or (not end)
|
||||
(<= (point) (- end 2))))
|
||||
(cons start end))))
|
||||
(in-comment
|
||||
(let ((start (save-excursion
|
||||
(beginning-of-line)
|
||||
(search-forward "//" (pos-eol) t))))
|
||||
(and (>= (point) start)
|
||||
(cons start (pos-eol))))))))
|
||||
(defun c-comments--need-comment-terminator (bounds)
|
||||
"Return non-nil if a comment terminator needs to be inserted given BOUNDS."
|
||||
(and (or (not (cdr bounds))
|
||||
(save-excursion
|
||||
(search-forward "/*" (cdr bounds) t)))))
|
||||
(defun c-comments-newline (&optional arg always-continue)
|
||||
"Insert ARG newlines and indent, automatically closing multi-line comments.
|
||||
Also, insert \"* \" at the beginning of every line when executed from inside a
|
||||
multi-line comment. If ALWAYS-CONTINUE is true, also insert \"//\" if called
|
||||
from inside a C++-style single-line comment."
|
||||
(interactive "*Pi")
|
||||
(when (and arg (< (prefix-numeric-value arg) 0))
|
||||
(user-error "Count cannot be negative"))
|
||||
(if-let ((bounds (c-comments-bounds-at-point))
|
||||
((or always-continue (not (nth 7 (syntax-ppss))))))
|
||||
(progn
|
||||
(when (c-comments--need-comment-terminator bounds)
|
||||
(save-excursion
|
||||
(insert "\n*/")
|
||||
(indent-region (pos-bol) (pos-eol))))
|
||||
(dotimes (_ (prefix-numeric-value arg))
|
||||
(default-indent-new-line))
|
||||
(when (save-excursion
|
||||
(forward-char -1)
|
||||
(looking-at-p (regexp-opt '("*" "/"))))
|
||||
(insert " ")))
|
||||
(newline arg t)))
|
||||
(defun c-comments-newline-always-continue (&optional arg)
|
||||
"Like calling `c-comments-newline', but always continue comments.
|
||||
That is, this is equivalent to (c-comments-newline ARG t)."
|
||||
(interactive "*P")
|
||||
(c-comments-newline arg t))
|
||||
|
||||
(provide 'c-comments)
|
||||
;;; c-comments.el ends here
|
||||
Reference in New Issue
Block a user