From be13e8fc0194fbdb48562666e3ecb1ed097d8685 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Thu, 7 Sep 2023 16:08:42 -0700 Subject: [PATCH] Fix treesit-thing-settings for c++-ts-mode (bug#65810) * lisp/progmodes/c-ts-mode.el: (c-ts-mode--thing-settings): New varaible. (c-ts-base-mode): Use c-ts-mode--thing-settings. --- lisp/progmodes/c-ts-mode.el | 58 ++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 5f685e016d2..5b698eb09f4 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1014,6 +1014,36 @@ if `c-ts-mode-emacs-sources-support' is non-nil." (or (treesit-add-log-current-defun) (c-ts-mode--defun-name (c-ts-mode--emacs-defun-at-point)))) +;;; Things + +(defvar c-ts-mode--thing-settings + `(;; It's more useful to include semicolons as sexp so + ;; that users can move to the end of a statement. + (sexp (not ,(rx (or "{" "}" "[" "]" "(" ")" ",")))) + ;; compound_statement makes us jump over too big units + ;; of code, so skip that one, and include the other + ;; statements. + (sentence + ,(regexp-opt '("preproc" + "declaration" + "specifier" + "attributed_statement" + "labeled_statement" + "expression_statement" + "if_statement" + "switch_statement" + "do_statement" + "while_statement" + "for_statement" + "return_statement" + "break_statement" + "continue_statement" + "goto_statement" + "case_statement"))) + (text ,(regexp-opt '("comment" + "raw_string_literal")))) + "`treesit-thing-settings' for both C and C++.") + ;;; Support for FOR_EACH_* macros ;; ;; FOR_EACH_TAIL, FOR_EACH_TAIL_SAFE, FOR_EACH_FRAME etc., followed by @@ -1133,32 +1163,8 @@ BEG and END are described in `treesit-range-rules'." ;; spirit, especially when used for movement, is like "expression" ;; or "syntax unit". --yuan (setq-local treesit-thing-settings - `((c - ;; It's more useful to include semicolons as sexp so - ;; that users can move to the end of a statement. - (sexp (not ,(rx (or "{" "}" "[" "]" "(" ")" ",")))) - ;; compound_statement makes us jump over too big units - ;; of code, so skip that one, and include the other - ;; statements. - (sentence - ,(regexp-opt '("preproc" - "declaration" - "specifier" - "attributed_statement" - "labeled_statement" - "expression_statement" - "if_statement" - "switch_statement" - "do_statement" - "while_statement" - "for_statement" - "return_statement" - "break_statement" - "continue_statement" - "goto_statement" - "case_statement"))) - (text ,(regexp-opt '("comment" - "raw_string_literal")))))) + `((c ,@c-ts-mode--thing-settings) + (cpp ,@c-ts-mode--thing-settings))) ;; Nodes like struct/enum/union_specifier can appear in ;; function_definitions, so we need to find the top-level node. -- 2.39.5