From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#60983: 29.0.60; Tree-sitter user-level control Date: Thu, 26 Jan 2023 09:27:38 +0100 Message-ID: <875ycthf9h.fsf@thornhill.no> References: <83tu0kkuqo.fsf@gnu.org> <87tu0k3y6t.fsf@thornhill.no> <83mt6ckqts.fsf@gnu.org> <87zgacgiwe.fsf@thornhill.no> <834jshhvjh.fsf@gnu.org> <806A8560-A675-423F-9CFC-67D50D14E304@thornhill.no> <833580ipdo.fsf@gnu.org> <87lelq8jay.fsf@thornhill.no> Reply-To: Theodor Thornhill Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29149"; mail-complaints-to="usenet@ciao.gmane.io" Cc: eliz@gnu.org, 60983@debbugs.gnu.org, casouri@gmail.com To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu Jan 26 09:28:20 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pKxcJ-0007Jw-Vh for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 26 Jan 2023 09:28:20 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pKxc4-0003y6-7Z; Thu, 26 Jan 2023 03:28:04 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pKxc2-0003xf-Ia for bug-gnu-emacs@gnu.org; Thu, 26 Jan 2023 03:28:02 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pKxc2-0003p4-Au for bug-gnu-emacs@gnu.org; Thu, 26 Jan 2023 03:28:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pKxc1-0006tG-Uz for bug-gnu-emacs@gnu.org; Thu, 26 Jan 2023 03:28:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Theodor Thornhill Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 26 Jan 2023 08:28:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 60983 X-GNU-PR-Package: emacs X-Debbugs-Original-Cc: Eli Zaretskii , bug-gnu-emacs@gnu.org, casouri@gmail.com Original-Received: via spool by submit@debbugs.gnu.org id=B.167472167526474 (code B ref -1); Thu, 26 Jan 2023 08:28:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 26 Jan 2023 08:27:55 +0000 Original-Received: from localhost ([127.0.0.1]:60643 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pKxbu-0006sv-Go for submit@debbugs.gnu.org; Thu, 26 Jan 2023 03:27:55 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:47474) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pKxbr-0006sl-PZ for submit@debbugs.gnu.org; Thu, 26 Jan 2023 03:27:52 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pKxbp-0003wh-3Z for bug-gnu-emacs@gnu.org; Thu, 26 Jan 2023 03:27:50 -0500 Original-Received: from out2.migadu.com ([2001:41d0:2:aacc::]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pKxbj-0003mg-Ks; Thu, 26 Jan 2023 03:27:47 -0500 X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=thornhill.no; s=key1; t=1674721660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=iFYoQXmOI5y7c1tjwzvXVUcLhzdg9e3r2IDugBgRlDc=; b=aUpiiy4wrRPEn/psokg270+a6dAQOzvy7ptJN9+H6CZUZTUAHz3fJz5GtNcn6X4M0baphR UArV71S+paE+n+FlxPp6+2srBA0fWu7DPqoyMFnMQ9NqIlyZfgjf34vTKxQC0M1CQkUzbU CnH7NAYxXbE1F4XWJd48mHhOqRb497FDh7aChz8ni6EtjTp0tH2e7OTK1dDpcHFi3glTXi buPLrjqfdWYQ0WJ4s5NErjyDHClB32jMFaqRQtchuV2dxhFL76MRbI/29lSb8lwnJqMHDS FxvYZTxU1ZNJ4Q0ArlfEhN3F837g/fBJXQp90Ayz6Jrj5/1ORoA10UlF2ZoLOA== In-Reply-To: X-Migadu-Flow: FLOW_OUT Received-SPF: pass client-ip=2001:41d0:2:aacc::; envelope-from=theo@thornhill.no; helo=out2.migadu.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:254193 Archived-At: --=-=-= Content-Type: text/plain Stefan Monnier writes: >> -(defcustom c-ts-mode-indent-style 'gnu >> +(defcustom c-ts-mode-indent-style "gnu" >> "Style used for indentation. >> >> The selected style could be one of GNU, K&R, LINUX or BSD. If >> @@ -100,13 +100,33 @@ c-ts-mode-indent-style >> set instead. This function is expected return a list that >> follows the form of `treesit-simple-indent-rules'." >> :version "29.1" >> - :type '(choice (symbol :tag "Gnu" 'gnu) >> - (symbol :tag "K&R" 'k&r) >> - (symbol :tag "Linux" 'linux) >> - (symbol :tag "BSD" 'bsd) >> + :type '(choice (string :tag "Gnu" "gnu") >> + (string :tag "K&R" "k&r") >> + (string :tag "Linux" "linux") >> + (string :tag "BSD" "bsd") >> (function :tag "A function for user customized style" ignore)) >> + :set #'c-ts-mode--indent-style >> :group 'c) > > Why change to strings? > BTW the previous code seems wrong: instead of > > (symbol :tag "FOO" 'foo) > > it should be > > (symbol :tag "FOO" foo) > > since `'foo` is not a symbol but a list (of two symbols). > Thanks, fixed. >> +(defun c-ts-mode--indent-style (sym val) >> + "Custom setter for `c-ts-mode-indent-style'." >> + (set-default sym val)) > > Hmm... why bother use a `:set`ter if it doesn't do anything more than > the default does? > Shouldn't it call `treesit--indent-rules-optimize` to (re)set > `treesit-simple-indent-rules`? > [ Presumably in all relevant buffers, since the defcustom setting is > global. ] > Thanks, done. >> +(defun c-ts-mode-set-style () >> + (interactive) >> + (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode) >> + (error "Buffer %s is not a c-ts-mode (c-ts-mode-set-style)" >> + (buffer-name))) >> + (if-let ((mode (cond ((eq major-mode 'c-ts-mode) 'c) >> + ((eq major-mode 'c++-ts-mode) 'cpp) >> + (t nil))) >> + (choice (completing-read "Select style: " '("gnu" "k&r" "linux" "bsd")))) > > Here, we probably want to specify `must-match` to `completing-read` > (which makes it unnecessary to check `if-let`, I think) and we should > provide a default. > Also we should probably use the (c-ts-mode--indent-styles mode) alist > rather than hardcode the set of styles. > >> + (c-ts-mode--indent-style 'c-ts-mode-indent-style choice) >> + (kill-local-variable 'treesit-simple-indent-rules) >> + (setq-local treesit-simple-indent-rules >> + (treesit--indent-rules-optimize >> + (c-ts-mode--set-indent-style mode))))) > > Here we presumably want to do the (setq-local > treesit-simple-indent-rules ...) every time (and set > `c-ts-mode-indent-style` buffer locally rather than via > `c-ts-mode--indent-style`, or otherwise provide an additional arg to > `c-ts-mode--indent-style` to say whether it applies globally or only to > the current buffer). > > BTW, the naming of `c-ts-mode--indent-style` and > `c-ts-mode--set-indent-style` is confusing. > > Also: why `kill-local-variable` just before the `setq-local`? > >> - (pcase c-ts-mode-indent-style >> - ('gnu (alist-get 'gnu (c-ts-mode--indent-styles mode))) >> - ('k&r (alist-get 'k&r (c-ts-mode--indent-styles mode))) >> - ('bsd (alist-get 'bsd (c-ts-mode--indent-styles mode))) >> - ('linux (alist-get 'linux (c-ts-mode--indent-styles mode))))))) >> + (alist-get c-ts-mode-indent-style >> + (c-ts-mode--indent-styles mode) nil nil #'equal)))) > > Thanks :-) > > > Stefan Does this patch look better? It also works, now :) Theo --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Initial-c-ts-mode-set-style-attempt.patch >From 49b135580ba3d60b2f77dada99a1adc4c64ef9b2 Mon Sep 17 00:00:00 2001 From: Theodor Thornhill Date: Wed, 25 Jan 2023 21:04:00 +0100 Subject: [PATCH] Initial c-ts-mode-set-style attempt --- lisp/progmodes/c-ts-mode.el | 47 ++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 95f9001e0d..0585795f35 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -92,6 +92,25 @@ c-ts-mode-indent-offset :safe 'integerp :group 'c) +(defun c-ts-mode--indent-style-setter (sym val) + "Custom setter for `c-ts-mode-set-style'." + (named-let loop ((res nil) + (buffers (buffer-list))) + (if (null buffers) + (mapc (lambda (b) + (with-current-buffer b + (set-default sym val) + (setq-local treesit-simple-indent-rules + (treesit--indent-rules-optimize + (c-ts-mode--set-indent-style + (if (eq major-mode 'c-ts-mode) 'c 'cpp)))))) + res) + (let ((buffer (car buffers))) + (with-current-buffer buffer + (if (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode)) + (loop (append res (list buffer)) (cdr buffers)) + (loop res (cdr buffers)))))))) + (defcustom c-ts-mode-indent-style 'gnu "Style used for indentation. @@ -100,13 +119,27 @@ c-ts-mode-indent-style set instead. This function is expected return a list that follows the form of `treesit-simple-indent-rules'." :version "29.1" - :type '(choice (symbol :tag "Gnu" 'gnu) - (symbol :tag "K&R" 'k&r) - (symbol :tag "Linux" 'linux) - (symbol :tag "BSD" 'bsd) + :type '(choice (symbol :tag "Gnu" gnu) + (symbol :tag "K&R" k&r) + (symbol :tag "Linux" linux) + (symbol :tag "BSD" bsd) (function :tag "A function for user customized style" ignore)) + :set #'c-ts-mode--indent-style-setter :group 'c) +(defun c-ts-mode-set-style () + (interactive) + (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode) + (error "Buffer %s is not a c-ts-mode (c-ts-mode-set-style)" + (buffer-name))) + (c-ts-mode--indent-style-setter + 'c-ts-mode-indent-style + (intern + (completing-read + "Select style: " + (mapcar #'car (c-ts-mode--indent-styles (if (eq major-mode 'c-ts-mode) 'c 'cpp))) + nil t nil nil "gnu")))) + ;;; Syntax table (defvar c-ts-mode--syntax-table @@ -255,11 +288,7 @@ c-ts-mode--set-indent-style (let ((style (if (functionp c-ts-mode-indent-style) (funcall c-ts-mode-indent-style) - (pcase c-ts-mode-indent-style - ('gnu (alist-get 'gnu (c-ts-mode--indent-styles mode))) - ('k&r (alist-get 'k&r (c-ts-mode--indent-styles mode))) - ('bsd (alist-get 'bsd (c-ts-mode--indent-styles mode))) - ('linux (alist-get 'linux (c-ts-mode--indent-styles mode))))))) + (alist-get c-ts-mode-indent-style (c-ts-mode--indent-styles mode))))) `((,mode ,@style)))) (defun c-ts-mode--top-level-label-matcher (node &rest _) -- 2.34.1 --=-=-=--