bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#60983: 29.0.60; Tree-sitter user-level control


From: Eli Zaretskii
Subject: bug#60983: 29.0.60; Tree-sitter user-level control
Date: Sun, 29 Jan 2023 15:33:22 +0200

> From: Yuan Fu <casouri@gmail.com>
> Date: Mon, 23 Jan 2023 15:55:30 -0800
> Cc: Eli Zaretskii <eliz@gnu.org>,
>  Bug Report Emacs <bug-gnu-emacs@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?





reply via email to

[Prev in Thread] Current Thread [Next in Thread]