From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>, Yuan Fu <casouri@gmail.com>,
Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 60983@debbugs.gnu.org
Subject: bug#60983: 29.0.60; Tree-sitter user-level control
Date: Sun, 29 Jan 2023 20:12:39 +0100 [thread overview]
Message-ID: <87pmaxqhnc.fsf@thornhill.no> (raw)
In-Reply-To: <83y1pl79el.fsf@gnu.org>
Eli Zaretskii <eliz@gnu.org> writes:
>> 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?
I'm sure you know this, but adding the below patch "fixes" it. It seems
like the inheritance isn't registered somehow without a defined
mode-map?
Theo
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 612c41bf07..e9f9eea69c 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -703,6 +703,10 @@ c-ts-mode-map
"C-c C-q" #'c-ts-mode-indent-defun
"C-c ." #'c-ts-mode-set-style)
+(defvar-keymap c++-ts-mode-map
+ :doc "Keymap for the C++ language with tree-sitter"
+ :parent c-ts-mode-map)
+
;;;###autoload
(define-derived-mode c-ts-base-mode prog-mode "C"
"Major mode for editing C, powered by tree-sitter.
@@ -810,7 +814,9 @@ c++-ts-mode
(add-to-list \\='major-mode-remap-alist
\\='(c-or-c++-mode . c-or-c++-ts-mode))
-in your configuration."
+in your configuration.
+
+\\{c++-ts-mode-map}"
:group 'c++
(when (treesit-ready-p 'cpp)
next prev parent reply other threads:[~2023-01-29 19:12 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-21 11:11 bug#60983: 29.0.60; Tree-sitter user-level control Eli Zaretskii
2023-01-21 11:48 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-21 12:36 ` Eli Zaretskii
2023-01-21 12:40 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 19:37 ` Yuan Fu
2023-01-23 19:59 ` Eli Zaretskii
2023-01-23 21:08 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 23:55 ` Yuan Fu
2023-01-29 13:33 ` Eli Zaretskii
2023-01-29 19:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2023-01-29 19:41 ` Eli Zaretskii
2023-01-30 2:28 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-30 13:45 ` Eli Zaretskii
2023-01-24 3:26 ` Eli Zaretskii
2023-01-25 20:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-25 21:16 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 8:27 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 6:08 ` Eli Zaretskii
2023-01-26 6:25 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 16:52 ` Eli Zaretskii
2023-01-26 7:27 ` Eli Zaretskii
2023-01-26 7:37 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 9:08 ` Eli Zaretskii
2023-01-28 13:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-28 13:25 ` Eli Zaretskii
2023-01-28 18:41 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-29 13:24 ` Eli Zaretskii
2023-01-26 7:56 ` Yuan Fu
2023-02-03 3:07 ` Yuan Fu
2023-02-03 7:47 ` Eli Zaretskii
2023-02-04 23:38 ` Yuan Fu
2023-02-05 6:01 ` Eli Zaretskii
2023-02-05 7:54 ` Yuan Fu
2023-02-05 9:23 ` Eli Zaretskii
2023-02-05 9:42 ` Yuan Fu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87pmaxqhnc.fsf@thornhill.no \
--to=bug-gnu-emacs@gnu.org \
--cc=60983@debbugs.gnu.org \
--cc=casouri@gmail.com \
--cc=eliz@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=theo@thornhill.no \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).