GNU bug report logs -
#60983
29.0.60; Tree-sitter user-level control
Previous Next
Full log
Message #74 received at 60983 <at> debbugs.gnu.org (full text, mbox):
> From: Yuan Fu <casouri <at> gmail.com>
> Date: Mon, 23 Jan 2023 15:55:30 -0800
> Cc: Eli Zaretskii <eliz <at> gnu.org>,
> Bug Report Emacs <bug-gnu-emacs <at> gnu.org>
>
> >> Thanks. What about the questions I asked regarding indentation
> >> features, and specifically about c-ts-mode-indent-style?
> >
> > I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
> >
> > I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.
>
> One common approach is to iterate over all live buffer and reset the variable (in this case treesit-simple-indent-rules) on applicate buffers (in this case c/c++-ts-mode buffers).
>
> It would be nice to also have a command c-ts-mode-set-style (like c-set-style) that takes a style symbol and sets treesit-simple-indent-rules accordingly. And in major-mode setup, ie, c-ts-mode’s body, you call it with c-ts-mode-indent-style.
This command now exists, courtesy of Theo, but I see some strange
misbehavior with it in c++-ts-mode, related to keymap inheritance:
emacs -Q
M-x c-ts-mode RET
C-h c C-c C-q
=> C-c C-q runs the command c-ts-mode-indent-defun
But
M-x c++-ts-mode RET
C-h c C-c C-q
=> C-c C-q is undefined
This is strange, since the binding is defined in c-ts-mode-map, which
is used in c-ts-base-mode:
(defvar-keymap c-ts-mode-map
:doc "Keymap for the C language with tree-sitter"
:parent prog-mode-map
"C-c C-q" #'c-ts-mode-indent-defun
"C-c ." #'c-ts-mode-set-style)
;;;###autoload
(define-derived-mode c-ts-base-mode prog-mode "C"
"Major mode for editing C, powered by tree-sitter.
\\{c-ts-mode-map}"
:syntax-table c-ts-mode--syntax-table
and both c-ts-mode and c++-ts-mode derive from c-ts-base-mode:
(define-derived-mode c-ts-mode c-ts-base-mode "C"
"Major mode for editing C, powered by tree-sitter.
(define-derived-mode c++-ts-mode c-ts-base-mode "C++"
"Major mode for editing C++, powered by tree-sitter.
What's missing here? Stefan, any advice?
This bug report was last modified 2 years and 193 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.