[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 81391ae3f52: Add tree-sitter comment-indent-new-line (bug#70074)
From: |
Yuan Fu |
Subject: |
master 81391ae3f52: Add tree-sitter comment-indent-new-line (bug#70074) |
Date: |
Mon, 22 Apr 2024 00:27:36 -0400 (EDT) |
branch: master
commit 81391ae3f52a41f30137642976ae06dd49572bfe
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>
Add tree-sitter comment-indent-new-line (bug#70074)
* lisp/progmodes/c-ts-common.el:
(c-ts-common-comment-indent-new-line): New function.
(c-ts-common-comment-setup): Setup comment-line-break-function and
comment-multi-line.
---
lisp/progmodes/c-ts-common.el | 50 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/lisp/progmodes/c-ts-common.el b/lisp/progmodes/c-ts-common.el
index e48bcc64f14..298fb3cd074 100644
--- a/lisp/progmodes/c-ts-common.el
+++ b/lisp/progmodes/c-ts-common.el
@@ -221,7 +221,9 @@ Set up:
- `adaptive-fill-first-line-regexp'
- `paragraph-start'
- `paragraph-separate'
- - `fill-paragraph-function'"
+ - `fill-paragraph-function'
+ - `comment-line-break-function'
+ - `comment-multi-line'"
(setq-local comment-start "// ")
(setq-local comment-end "")
(setq-local comment-start-skip (rx (or (seq "/" (+ "/"))
@@ -267,7 +269,51 @@ Set up:
eol)
"\f")))
(setq-local paragraph-separate paragraph-start)
- (setq-local fill-paragraph-function #'c-ts-common--fill-paragraph))
+ (setq-local fill-paragraph-function #'c-ts-common--fill-paragraph)
+
+ (setq-local comment-line-break-function
+ #'c-ts-common-comment-indent-new-line)
+ (setq-local comment-multi-line t))
+
+(defun c-ts-common-comment-indent-new-line (&optional soft)
+ "Break line at point and indent, continuing comment if within one.
+
+This is like `comment-indent-new-line', but specialized for C-style //
+and /* */ comments. SOFT works the same as in
+`comment-indent-new-line'."
+ ;; I want to experiment with explicitly listing out all each cases and
+ ;; handle them separately, as opposed to fiddling with `comment-start'
+ ;; and friends. This will have more duplicate code and will be less
+ ;; generic, but in the same time might save us from writting cryptic
+ ;; code to handle all sorts of edge cases.
+ ;;
+ ;; For this command, let's try to make it basic: if the current line
+ ;; is a // comment, insert a newline and a // prefix; if the current
+ ;; line is in a /* comment, insert a newline and a * prefix. No
+ ;; auto-fill or other smart features.
+ (cond
+ ((save-excursion
+ (beginning-of-line)
+ (looking-at (rx "//" (group (* " ")))))
+ (let ((whitespaces (match-string 1)))
+ (if soft (insert-and-inherit ?\n) (newline 1))
+ (delete-region (point) (line-end-position))
+ (insert "//" whitespaces)))
+
+ ((save-excursion
+ (beginning-of-line)
+ (looking-at (rx "/*")))
+ (if soft (insert-and-inherit ?\n) (newline 1))
+ (delete-region (point) (line-end-position))
+ (insert " *"))
+
+ ((save-excursion
+ (beginning-of-line)
+ (looking-at (rx (group (* " ") (or "*" "|") (* " ")))))
+ (let ((prefix (match-string 1)))
+ (if soft (insert-and-inherit ?\n) (newline 1))
+ (delete-region (point) (line-end-position))
+ (insert prefix)))))
;;; Statement indent
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 81391ae3f52: Add tree-sitter comment-indent-new-line (bug#70074),
Yuan Fu <=