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

Fix c-ts-mode indentation after if/else (bug#67417)

* lisp/progmodes/c-ts-mode.el:
(c-ts-mode--prev-line-match): New function.
(c-ts-mode--indent-styles): Add a rule for the empty line after
if/else/for/etc.
This commit is contained in:
Yuan Fu 2023-11-26 17:42:51 -08:00
parent f8d9dc26c7
commit dab7cc241f
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -355,11 +355,27 @@ PARENT, BOL, ARGS are the same as other anchor functions."
(apply (alist-get 'standalone-parent treesit-simple-indent-presets) (apply (alist-get 'standalone-parent treesit-simple-indent-presets)
parent (treesit-node-parent parent) bol args)) parent (treesit-node-parent parent) bol args))
(defun c-ts-mode--prev-line-match (regexp)
"An indentation matcher that matches if prev line matches REGEXP."
(lambda (_n _p bol &rest _)
(save-excursion
(goto-char bol)
(forward-line -1)
(back-to-indentation)
(looking-at-p regexp))))
(defun c-ts-mode--indent-styles (mode) (defun c-ts-mode--indent-styles (mode)
"Indent rules supported by `c-ts-mode'. "Indent rules supported by `c-ts-mode'.
MODE is either `c' or `cpp'." MODE is either `c' or `cpp'."
(let ((common (let ((common
`((c-ts-mode--for-each-tail-body-matcher prev-line c-ts-mode-indent-offset) `((c-ts-mode--for-each-tail-body-matcher prev-line c-ts-mode-indent-offset)
;; If the user types "if (...)" and hit return, they expect
;; the point on the empty line to be indented, this rule
;; does that.
((and no-node
(c-ts-mode--prev-line-match
,(rx (or "if" "else" "while" "do" "for"))))
prev-line c-ts-mode-indent-offset)
((parent-is "translation_unit") column-0 0) ((parent-is "translation_unit") column-0 0)
((query "(ERROR (ERROR)) @indent") column-0 0) ((query "(ERROR (ERROR)) @indent") column-0 0)