From dab7cc241f426af3c9fe901954fe48e415dcf75a Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sun, 26 Nov 2023 17:42:51 -0800 Subject: [PATCH] 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. --- lisp/progmodes/c-ts-mode.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 5975057518e..1a7424db5d9 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -355,11 +355,27 @@ PARENT, BOL, ARGS are the same as other anchor functions." (apply (alist-get 'standalone-parent treesit-simple-indent-presets) 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) "Indent rules supported by `c-ts-mode'. MODE is either `c' or `cpp'." (let ((common `((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) ((query "(ERROR (ERROR)) @indent") column-0 0) -- 2.39.2