X-Loop: help-debbugs@HIDDEN
Subject: bug#68493: Got to be a better way to customize c-ts-mode indentation
Resent-From: Daniel Colascione <dancol@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Mon, 15 Jan 2024 23:52:02 +0000
Resent-Message-ID: <handler.68493.B.170536271011503 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: report 68493
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords:
To: 68493 <at> debbugs.gnu.org
X-Debbugs-Original-To: bug-gnu-emacs@HIDDEN
Received: via spool by submit <at> debbugs.gnu.org id=B.170536271011503
(code B ref -1); Mon, 15 Jan 2024 23:52:02 +0000
Received: (at submit) by debbugs.gnu.org; 15 Jan 2024 23:51:50 +0000
Received: from localhost ([127.0.0.1]:47267 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1rPWk9-0002zS-Fx
for submit <at> debbugs.gnu.org; Mon, 15 Jan 2024 18:51:49 -0500
Received: from lists.gnu.org ([2001:470:142::17]:55036)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <dancol@HIDDEN>) id 1rPWk7-0002zE-3x
for submit <at> debbugs.gnu.org; Mon, 15 Jan 2024 18:51:47 -0500
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 <dancol@HIDDEN>) id 1rPWk1-0008P2-2g
for bug-gnu-emacs@HIDDEN; Mon, 15 Jan 2024 18:51:41 -0500
Received: from dancol.org ([2600:3c01:e000:3d8::1])
by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.90_1) (envelope-from <dancol@HIDDEN>) id 1rPWjx-0007VK-UZ
for bug-gnu-emacs@HIDDEN; Mon, 15 Jan 2024 18:51:40 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dancol.org;
s=x;
h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From:Sender:
Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description:
Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:
In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:
List-Post:List-Owner:List-Archive;
bh=/vCamFzUB8Cz4FOW+ywovr5O2WOKiNE+JJMTXM5M3oU=; b=YZPC+oe64tIs4lbXk82A7Nh9Wp
qF1kMM1upjY1Ys4B9Xt1j5fdJeEhkbtUkJnx0ceZ6WOySsViy6+2alPoBdXrfd+nNNs8NYOFOVtGE
NnZLUHzOeF7NF7KwrGL5hvW9rI7KCyEihkV3kIvLt6N3cTUxKVDS4vAUsGK3sfRgRfWKxUjmPHaJR
BIuGJpiKPNHG9/ZLL6fDoebtnjvcFv3DrO+J02DzVeuUSGJCOvSSxsC8Vmpb5UFK3j7IypLblRZxJ
3+UxCEeNc/YjS8h2Wbb2Hnmmh7Q7OJtV/4YRJoeiCylVB73DokvSrzYLrkbfdYjsn9RDnBrtCqqqD
DbtEcICw==;
Received: from 2603-9001-4203-1ab2-ac30-20a9-5618-a91d.inf6.spectrum.com
([2603:9001:4203:1ab2:ac30:20a9:5618:a91d]:40342 helo=localhost)
by dancol.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
(Exim 4.94.2) (envelope-from <dancol@HIDDEN>) id 1rPWjm-0002ef-Im
for bug-gnu-emacs@HIDDEN; Mon, 15 Jan 2024 18:51:27 -0500
From: Daniel Colascione <dancol@HIDDEN>
User-Agent: mu4e 1.11.27; emacs 30.0.50
Date: Mon, 15 Jan 2024 18:51:25 -0500
Message-ID: <87jzoagnpe.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
Received-SPF: pass client-ip=2600:3c01:e000:3d8::1;
envelope-from=dancol@HIDDEN; helo=dancol.org
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001,
SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 0.9 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.1 (/)
There's got to be a way to customize tree-sitter-based indentation
that's cleaner than the patching I'm doing below.
In particular, we can't just prepend custom rules to those of a base
style because doing so puts those rules ahead of high-priority rules in
the base style that might account for weird syntactic conditions.
In addition, this patching isn't exactly amenable to something checked
into .dir-locals.el or file-local variables. It's code, not data.
I really think we need a robust, *data*-based approach to describing
indentation schemes, like cc-mode's existing system. (Wouldn't it be
nice if we could use cc-mode indentation rules with c-ts-mode?)
Maybe we have c-ts-mode--indent-styles "compile" a passive indent schema
data structure (one suitable for dir-locals) into raw tree-sitter
indentation rules?
----------
;; Why edit the K&R rules in particular? Because the K&R rule-set is
;; the unmolested "common" rule-set. We want to edit the rules
;; starting from this base instead of from the other styles, which
;; prefix various things to the base rules.
(defun dancol-edit-ts-rules (orig-rules patches)
"Edit tree-sitter indentation rules
ORIG-RULES is a tree sitter rule set as described in the ELisp
manual. PATCHES is a sequence of PATCH lists, in which each
PATCH is (:from OLD-RULE :to NEW-RULE). OLD-RULE is a rule in
ORIG-RULES and NEW-RULE is its replacement. This function,
unlike just prepending rules to ORIG-RULES, preserves the
ordering of rules and minimizes the degree to which style
customization might break order-dependent matching heuristics in
ORIG-RULES.
Each PATCH is PATCHES must apply at least once or this function
will signal an error. This way, we don't allow indentation rules
to silently bitrot as the rule set we're patches evolves.
Return the edited rule list."
(let ((rules (cl-copy-list orig-rules)))
(pcase-dolist (`(:from ,from :to ,to) patches)
(unless (member from orig-rules)
(error "rule %S not in ORIG-RULES" from))
(setf rules
(cl-nsubstitute to from rules :test #'equal)))
rules))
(defun dancol-edit-k&r-rules (rules)
(dancol-edit-ts-rules rules
`(;; Namespaces shouldn't add indentation
(:from
((parent-is "declaration_list")
parent-bol c-ts-mode-indent-offset)
:to
((parent-is "declaration_list") parent-bol 0))
;; Don't line up operands --- just indent on continuation: nice
;; and simple
(:from
((parent-is "binary_expression") parent 0)
:to
((parent-is "binary_expression")
parent-bol ,(* c-ts-mode-indent-offset 2)))
;; Indent other expression continuations instead of lineup
,@(mapcar (lambda (node-name)
`(:from
((parent-is ,node-name) first-sibling 1)
:to
((parent-is ,node-name)
parent-bol ,(* c-ts-mode-indent-offset 2))))
'("parameter_list"
"argument_list"
"parenthesized_expression"))
,@(mapcar (lambda (node-name)
`(:from
((parent-is ,node-name) first-sibling 0)
:to
((parent-is ,node-name)
parent-bol ,(* c-ts-mode-indent-offset 2))))
'("concatenated_string"
"conditional_expression"
"comma_expression")))))
(defun dancol-c-ts-mode--indent-styles (base-styles)
`((dancol ,@(dancol-edit-k&r-rules
(cdr (or (assoc 'k&r base-styles)
(error "no K&R style")))))
,@base-styles))
(advice-add 'c-ts-mode--indent-styles
:filter-return
#'dancol-c-ts-mode--indent-styles)
(defun dancol-c-ts-mode-setup ()
(c-ts-mode-set-style 'dancol))
(add-hook 'c-ts-base-mode-hook #'dancol-c-ts-mode-setup)
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: Daniel Colascione <dancol@HIDDEN> Subject: bug#68493: Acknowledgement (Got to be a better way to customize c-ts-mode indentation) Message-ID: <handler.68493.B.170536271011503.ack <at> debbugs.gnu.org> References: <87jzoagnpe.fsf@HIDDEN> X-Gnu-PR-Message: ack 68493 X-Gnu-PR-Package: emacs Reply-To: 68493 <at> debbugs.gnu.org Date: Mon, 15 Jan 2024 23:52:02 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): bug-gnu-emacs@HIDDEN If you wish to submit further information on this problem, please send it to 68493 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 68493: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D68493 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
X-Loop: help-debbugs@HIDDEN
Subject: bug#68493: Got to be a better way to customize c-ts-mode indentation
Resent-From: Eli Zaretskii <eliz@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: bug-gnu-emacs@HIDDEN
Resent-Date: Tue, 16 Jan 2024 12:20:01 +0000
Resent-Message-ID: <handler.68493.B68493.170540757525221 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 68493
X-GNU-PR-Package: emacs
X-GNU-PR-Keywords:
To: Daniel Colascione <dancol@HIDDEN>
Cc: 68493 <at> debbugs.gnu.org
Received: via spool by 68493-submit <at> debbugs.gnu.org id=B68493.170540757525221
(code B ref 68493); Tue, 16 Jan 2024 12:20:01 +0000
Received: (at 68493) by debbugs.gnu.org; 16 Jan 2024 12:19:35 +0000
Received: from localhost ([127.0.0.1]:47974 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1rPiPn-0006Yi-EF
for submit <at> debbugs.gnu.org; Tue, 16 Jan 2024 07:19:35 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:53926)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <eliz@HIDDEN>) id 1rPiPl-0006YS-DW
for 68493 <at> debbugs.gnu.org; Tue, 16 Jan 2024 07:19:34 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
id 1rPiPf-00073h-4q; Tue, 16 Jan 2024 07:19:27 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
mime-version; bh=NnOcI5WL3vZw7oOuGPef5WWQWKsX3JasSVgb5qGM1z8=; b=g1qD/QCE/YBF
pePIkaqleudsTLyF++eGJLeaBcpQHd4b06keONql6lhMClX4TSf9VU3O8h6/cjYJE+Ij/BB8yLscD
o+e5eQWTd7z8JylxAc+et1I708CbFQBBxun6FzivRveyGUCFjlQYsWIuy4pEAE8styN8M6YKJk/4c
YmjRzF+N+npFy+tDGFeLl8ZqoO18ijweCPVihU/sQ99+H92bu+EBGyuysBcufgAGAVA/m46iGW4eF
BOxtfFMOFP08VJSl3O7RyQfdC4qwr9Ui5lJgR/eH64N1e3JA+O/JHeT/tnudfRrdmGpYJD7qwmJO3
PyslgcUONK41vA4ycd+mag==;
Date: Tue, 16 Jan 2024 14:19:13 +0200
Message-Id: <83il3tcvy6.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
In-Reply-To: <87jzoagnpe.fsf@HIDDEN> (message from Daniel Colascione on
Mon, 15 Jan 2024 18:51:25 -0500)
References: <87jzoagnpe.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)
> From: Daniel Colascione <dancol@HIDDEN>
> Date: Mon, 15 Jan 2024 18:51:25 -0500
>
> There's got to be a way to customize tree-sitter-based indentation
> that's cleaner than the patching I'm doing below.
Agreed. Patches welcome.
> Wouldn't it be nice if we could use cc-mode indentation rules with
> c-ts-mode?
It would, indeed. Of course, it isn't easy: CC Mode's indentation
rules are defined in terms of pseudo-syntactic parameters that don't
map easily (to say the least) into what a parser returns, and many of
the rules invoke CC Mode functions (as opposed to reference variables
and literals) that are specific to CC Mode and its analysis of the C
source. Again, patches welcome.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.