bug#68493: Got to be a better way to customize c-ts-mode indentation

Eli Zaretskii <[email protected]>
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
> From: Tomas Nordin <[email protected]>
> Cc: Eli Zaretskii <[email protected]>, Daniel Colascione <[email protected]>,
>  [email protected]
> Date: Mon, 03 Aug 2026 21:19:29 +0000
> 
> Björn Lindqvist <[email protected]> writes:
> 
> > Den mån 3 aug. 2026 kl 14:46 skrev Tomas Nordin <[email protected]>:
> >> Is the following description this bug? Or should I talk more about it in
> >> some other or new report?
> >>
> >> Its about indentation of concatanated strings like this (in a c-buffer)
> >>
> >> char *lines =
> >>   "line1\n"
> >>   "line2\n"
> >>
> >> The above is what I "get" with c-mode (in emacs -Q). If I switch over to
> >> c-ts-mode and say C-x h and TAB, I get
> >>
> >> char *lines =
> >>   "line1\n"
> >>     "line2\n"
> >>
> >> Further literals will align with "line2\n". I would like it to be
> >> aligned as with c-mode. Is there a setting for this?
> >>
> >> This has been observed with
> >>
> >> GNU Emacs 31.0.90 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.49, cairo version 1.18.4) of 2026-07-02
> >
> > Hello Tomas,
> >
> > I can confirm the bug in 32.0.50. However, my c-ts-mode config I
> > posted on emacs-devel fixes it:
> >
> > https://gist.github.com/bjourne/31f53043c72728cb4d8b90feedd0625b
> >
> > You can take inspiration from that. Specifically, you need to prepend the
> > rule ((parent-is "concatenated_string") parent 0) to
> > treesit-simple-indent-rules.
> 
> Thanks for inspiration. I spent time trying to understand this stuff
> better. After that time I don't understand it much better, but maybe a
> little bit. With shotgun programming I arrived at the attached patch. It
> fixes the problem I reported, and here are two examples where I get what
> I want:
> 
>     helpexit (argc, argv, 0, 2,
>               "Usage: toks [--help] [<delims> [<startchar>]]\n"
>               "Read lines from stdin and print tokens.");
> 
> and
> 
>     char *lines =
>         "line1\n"
>         "line2\n";
> 
> The patch was made on top of todays emacs-31. I re-built the whole thing
> (patch applied) and will now run with it for some time and see if it
> holds.

Thanks.  Yuan and Stefan, any comments or suggestions?

> diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
> index 5f064716a89..fa09cb21b34 100644
> --- a/lisp/progmodes/c-ts-mode.el
> +++ b/lisp/progmodes/c-ts-mode.el
> @@ -503,7 +503,8 @@ c-ts-mode--simple-indent-rules
>                                  "enum_specifier"
>                                  "union_specifier"
>                                  "function_declarator"
> -                                "template_declaration")))
> +                                "template_declaration"
> +                                "concatenated_string")))
>              standalone-parent 0)
>             ;; This is for the trailing-star stype:  int *
>             ;;                                       func()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.