GNU bug report logs - #78065
31.0.50; treesit-simple-indent-rules: nth-sibling anchor preset doesn't work properly

Previous Next

Package: emacs;

Reported by: Roman Rudakov <rrudakov <at> fastmail.com>

Date: Fri, 25 Apr 2025 19:05:01 UTC

Severity: normal

Found in version 31.0.50

Done: Yuan Fu <casouri <at> gmail.com>

To reply to this bug, email your comments to 78065 AT debbugs.gnu.org.
There is no need to reopen the bug first.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#78065; Package emacs. (Fri, 25 Apr 2025 19:05:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Roman Rudakov <rrudakov <at> fastmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Fri, 25 Apr 2025 19:05:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Roman Rudakov <rrudakov <at> fastmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 31.0.50; treesit-simple-indent-rules: nth-sibling anchor preset
 doesn't work properly
Date: Fri, 25 Apr 2025 21:04:02 +0200
The bug itself is actually in 'treesit--simple-indent-eval' function.

Steps to reproduce:

Eval the following expression:
(treesit--simple-indent-eval '(nth-sibling 1 t))

Expected result: anchor lambda is returned.

Actual result:

Debugger entered--Lisp error: (treesit-indent-error "Couldn't find the 
preset corresponding to expression" t)

The function 'treesit--simple-indent-eval' is called recursively for 
every element in the expression, at some point it's called for 't', 
which matches '(symbolp exp)' predicate and is not null, which causes 
the error.



In GNU Emacs 31.0.50 (build 1, aarch64-apple-darwin24.4.0, NS
appkit-2575.50 Version 15.4.1 (Build 24E263)) of 2025-04-23 built on
macbookpro.home
Windowing system distributor 'Apple', version 10.3.2575
System Description:  macOS 15.4.1

Configured using:
'configure --disable-dependency-tracking --disable-silent-rules
--enable-locallisppath=/opt/homebrew/share/emacs/site-lisp
--infodir=/opt/homebrew/Cellar/emacs-plus <at> 31/31.0.50/share/info/emacs
--prefix=/opt/homebrew/Cellar/emacs-plus <at> 31/31.0.50
--with-native-compilation=aot --with-xml2 --with-gnutls
--without-compress-install --without-dbus --without-imagemagick
--with-modules --with-rsvg --with-webp --without-pop --with-ns
--disable-ns-self-contained 'CFLAGS=-O2 -DFD_SETSIZE=10000
-DDARWIN_UNLIMITED_SELECT -I/opt/homebrew/opt/sqlite/include
-I/opt/homebrew/opt/gcc/include 
-I/opt/homebrew/opt/libgccjit/include'
'LDFLAGS=-L/opt/homebrew/opt/sqlite/lib -L/opt/homebrew/lib/gcc/14
-I/opt/homebrew/opt/gcc/include 
-I/opt/homebrew/opt/libgccjit/include''
Configured features:
ACL GIF GLIB GMP GNUTLS JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY
KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS
TREE_SITTER WEBP XIM ZLIB
Important settings:
 value of $LANG: en_US.UTF-8
 locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
 telega-root-auto-fill-mode: t
 telega-contact-birthdays-mode: t
 telega-active-video-chats-mode: t
 telega-active-locations-mode: t
 telega-patrons-mode: t
 telega-active-stories-mode: t
 erc-track-mode: t
 erc-track-minor-mode: t
 erc-ring-mode: t
 erc-netsplit-mode: t
 erc-menu-mode: t
 erc-match-mode: t
 erc-log-mode: t
 erc-list-mode: t
 erc-irccontrols-mode: t
 erc-noncommands-mode: t
 erc-move-to-prompt-mode: t
 erc-readonly-mode: t
 erc-pcomplete-mode: t
 erc-button-mode: t
 erc-fill-mode: t
 erc-stamp-mode: t
 erc-autojoin-mode: t
 erc-autoaway-mode: t
 erc-networks-mode: t
 global-git-commit-mode: t
 magit-auto-revert-mode: t
 idle-highlight-mode: t
 subword-mode: t
 yas-minor-mode: t
 hl-todo-mode: t
 flymake-mode: t
 server-mode: t
 pdf-occur-global-minor-mode: t
 mu4e-column-faces-mode: t
 mu4e-modeline-mode: t
 direnv-mode: t
 auto-insert-mode: t
 electric-pair-mode: t
 org-roam-db-autosync-mode: t
 outline-minor-mode: t
 minions-mode: t
 repeat-mode: t
 save-place-mode: t
 minibuffer-electric-default-mode: t
 savehist-mode: t
 recentf-mode: t
 global-auto-revert-mode: t
 global-hl-line-mode: t
 apheleia-mode: t
 global-eldoc-mode: t
 eldoc-mode: t
 show-paren-mode: t
 electric-indent-mode: t
 mouse-wheel-mode: t
 tab-bar-mode: t
 menu-bar-mode: t
 file-name-shadow-mode: t
 global-font-lock-mode: t
 font-lock-mode: t
 blink-cursor-mode: t
 window-divider-mode: t
 minibuffer-regexp-mode: t
 column-number-mode: t
 line-number-mode: t
 transient-mark-mode: t
 auto-composition-mode: t
 auto-encryption-mode: t
 auto-compression-mode: t
 hs-minor-mode: t

Load-path shadows:
/Users/rrudakov/.config/emacs/elpa/ef-themes-1.9.0/theme-loaddefs 
hides 
/Users/rrudakov/.config/emacs/elpa/modus-themes-4.7.0/theme-loaddefs
/Users/rrudakov/.config/emacs/elpa/magit-4.3.2/magit-autorevert hides 
/Users/rrudakov/.config/emacs/elpa/magit-section-4.3.2/magit-autorevert
/Users/rrudakov/.config/emacs/elpa/password-store-20231201.954/password-store 
hides /opt/homebrew/share/emacs/site-lisp/pass/password-store
/Users/rrudakov/.config/emacs/elpa/transient-0.8.7/transient hides 
/opt/homebrew/Cellar/emacs-plus <at> 31/31.0.50/share/emacs/31.0.50/lisp/transient
/Users/rrudakov/.config/emacs/elpa/ef-themes-1.9.0/theme-loaddefs 
hides 
/opt/homebrew/Cellar/emacs-plus <at> 31/31.0.50/share/emacs/31.0.50/lisp/theme-loaddefs

Features:
(shadow info-look quail telega-obsolete telega telega-tdlib-events
telega-match telega-root telega-info telega-chat telega-modes
telega-company telega-emoji telega-user telega-notifications 
telega-voip
telega-msg telega-story telega-webpage visual-fill-column telega-tme
telega-sticker telega-vvnote bindat telega-ffplay telega-i18n
telega-sort telega-filter telega-ins telega-inline telega-util
telega-folders telega-topic telega-media telega-tdlib dired-aux ewoc
telega-server telega-core telega-customize emacsbug goto-addr 
flymake-cc
google-c-style misc plantuml-mode artist picture reporter find-dired
display-line-numbers mailalias edebug debug backtrace tramp-cache
time-stamp shortdoc cl-print help-fns radix-tree cal-move thai-util
thai-word lao-util enriched url-cache cal-iso cider-ns network-stream
epa-file erc-track erc-ring erc-netsplit erc-menu erc-match erc-log
erc-list erc-goodies erc-pcomplete erc-button erc-fill erc-stamp
erc-join erc-autoaway erc erc-backend erc-networks erc-common 
erc-compat
erc-loaddefs emacs-everywhere vc-hg vc-svn bug-reference misearch
multi-isearch pcmpl-unix pcmpl-gnu apheleia apheleia-rcs apheleia-dp
apheleia-formatters apheleia-utils apheleia-log
apheleia-formatter-context magit-extras markdown-mode edit-indirect
magit-ediff ediff ediff-merg ediff-mult ediff-wind ediff-diff 
ediff-help
ediff-init ediff-util view alert log4e gntp face-remap magit-bookmark
magit-submodule magit-blame magit-stash magit-reflog magit-bisect
magit-push magit-pull magit-fetch magit-clone magit-remote 
magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func magit-diff
smerge-mode diff git-commit log-edit pcvs-util add-log magit-core
magit-autorevert magit-margin magit-transient magit-process 
with-editor
magit-mode benchmark magit-git magit-base flymake-kondor 
clojure-ts-mode
clj-refactor hydra lv inflections mc-hide-unmatched-lines-mode
mc-mark-more sgml-mode mc-cycle-cursors multiple-cursors-core rect
paredit cider tramp-sh cider-debug cider-browse-ns cider-mode
cider-xref-backend cider-find cider-completion cider-profile
cider-inspector cider-eval cider-jar arc-mode archive-mode
cider-repl-history pulse cider-repl cider-resolve cider-test
cider-overlays cider-stacktrace cider-doc cider-browse-spec
cider-clojuredocs cider-eldoc cider-docstring cider-client 
cider-common
xref cider-completion-context cider-connection cider-popup
sesman-browser nrepl-client cider-util tramp trampver 
tramp-integration
tramp-message tramp-compat tramp-loaddefs sesman queue nrepl-dict
spinner parseedn parseclj-parser parseclj-lex parseclj-alist
clojure-mode align vc-git qp sort smiley gnus-cite mm-archive 
mail-extr
textsec uni-scripts idna-mapping uni-confusable textsec-check
idle-highlight-mode cap-words superword subword hideshow yasnippet
ef-maris-dark-theme ef-themes cus-start hl-todo checkdoc lisp-mnt
flymake server github org-git ghub-graphql treepy gsexp ghub url-http
url-gw nsm url-auth google-translate-smooth-ui 
google-translate-core-ui
facemenu color popup google-translate-core google-translate-backend
use-package-ensure pdf-occur tablist tablist-filter 
semantic/wisent/comp
semantic/wisent semantic/wisent/wisent semantic/util-modes 
semantic/util
semantic semantic/tag semantic/lex semantic/fw mode-local cedet
pdf-isearch let-alist pdf-misc pdf-tools pdf-view jka-compr pdf-cache
pdf-info tq pdf-util pdf-macs image-mode exif ob-restclient restclient
mu4e-column-faces mu4e-icalendar gnus-icalendar icalendar mu4e 
mu4e-org
mu4e-notification notifications mu4e-main smtpmail mu4e-view
mu4e-mime-parts mu4e-headers mu4e-thread mu4e-actions mu4e-compose
mu4e-draft gnus-msg mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark
mu4e-message flow-fill mu4e-contacts mu4e-update mu4e-folders
mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars
mu4e-helpers mu4e-config mu4e-window bookmark ido mu4e-obsolete 
nix-mode
ffap nix-repl nix-shell nix-store nix-log nix-instantiate nix-shebang
nix-format nix yaml-ts-mode dockerfile-ts-mode rust-ts-mode
typescript-ts-mode js c-ts-common imenu cc-mode cc-fonts cc-guess
cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs 
vlf-setup
vlf vlf-base vlf-tune direnv diff-mode track-changes autoinsert rg
files-x vc vc-dispatcher rg-info-hack rg-menu transient edmacro kmacro
rg-ibuffer rg-result wgrep-rg wgrep rg-history rg-header ibuf-ext
ibuffer ibuffer-loaddefs grep compile elec-pair emacsql-sqlite-builtin
org-roam-migrate org-roam-log org-roam-mode org-roam-capture 
org-roam-id
org-roam-node crm org-roam-db org-roam-utils org-roam-compat org-roam
org-capture emacsql-sqlite emacsql emacsql-compiler magit-section
cursor-sensor llama comp comp-cstr dash async ob-async ob-plantuml
ob-ditaa ob-clojure ob-haskell ob-sqlite ob-shell shell ob-sql 
ob-python
python project org-clock appt diary-lib diary-loaddefs org-duration
comp-run comp-common flyspell ispell oc-basic bibtex disp-table 
ol-info
ol-gnus nnselect gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls
dig gnus-sum shr-tag-pre-highlight language-detection shr pixel-fill
kinsoku url-file svg dom gnus-group gnus-undo gnus-start gnus-dbus 
dbus
xml gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time iso8601
gnus-spec gnus-int gnus-range message sendmail yank-media puny dired
dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev gmm-utils mailheader gnus-win gnus nnheader
gnus-util text-property-search mail-utils range mm-util mail-prsvr
ox-gfm ox-md ox-odt rng-loc rng-uri rng-parse rng-match rng-dt 
rng-util
rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-latex
ox-icalendar ox-html table ox-ascii ox-publish ox org-attach 
org-agenda
org-element org-persist org-id org-element-ast inline avl-tree 
generator
org-refile org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro
org-src sh-script smie treesit executable ob-comint org-pcomplete
pcomplete org-list org-footnote org-faces org-entities time-date
noutline outline org-version ob-emacs-lisp ob-core ob-eval org-cycle
org-table org-keys oc org-loaddefs thingatpt find-func cal-menu 
calendar
cal-loaddefs ol org-fold org-fold-core org-compat org-macs format-spec
exec-path-from-shell minions compat repeat hippie-exp comint ansi-osc
ansi-color ring advice saveplace minibuf-eldef savehist recentf
tree-widget cl-extra help-mode autorevert filenotify use-package-core
hl-line finder-inf add-node-modules-path-autoloads alert-autoloads
apheleia-autoloads easy-mmode auctex-autoloads tex-site
buttercup-autoloads clj-refactor-autoloads cider-autoloads
clojure-mode-autoloads clojure-ts-mode-autoloads csv-mode-autoloads
debbugs-autoloads dired-git-info-autoloads dired-subtree-autoloads
dired-hacks-utils-autoloads direnv-autoloads dtrt-indent-autoloads
edit-indirect-autoloads ef-themes-autoloads elfeed-autoloads
emacs-everywhere-autoloads emmet-mode-autoloads
exec-path-from-shell-autoloads expand-region-autoloads
flymake-kondor-autoloads flyspell-correct-autoloads ghub-autoloads
git-link-autoloads gitignore-templates-autoloads gntp-autoloads
google-c-style-autoloads google-translate-autoloads
groovy-mode-autoloads haskell-mode-autoloads hl-todo-autoloads
hydra-autoloads idle-highlight-mode-autoloads inflections-autoloads
log4e-autoloads logview-autoloads datetime-autoloads extmap-autoloads
lua-mode-autoloads lv-autoloads magit-autoloads pcase
markdown-mode-autoloads minions-autoloads modus-themes-autoloads
mu4e-column-faces-autoloads multiple-cursors-autoloads
nginx-mode-autoloads nix-mode-autoloads nov-autoloads esxml-autoloads
ob-async-autoloads async-autoloads ob-restclient-autoloads
org-roam-autoloads magit-section-autoloads llama-autoloads
emacsql-autoloads org-tree-slide-autoloads ox-jira-autoloads
ox-slack-autoloads ox-gfm-autoloads paredit-autoloads 
parseedn-autoloads
parseclj-autoloads password-store-otp-autoloads 
password-store-autoloads
pdf-tools-autoloads pip-requirements-autoloads pkgbuild-mode-autoloads
plantuml-mode-autoloads dash-autoloads popup-autoloads 
pyvenv-autoloads
queue-autoloads rainbow-mode-autoloads restclient-autoloads 
rg-autoloads
s-autoloads sesman-autoloads shr-tag-pre-highlight-autoloads
language-detection-autoloads sly-autoloads warnings spinner-autoloads
sql-indent-autoloads ssh-config-mode-autoloads rx tablist-autoloads
telega-autoloads transient-autoloads treepy-autoloads
vimrc-mode-autoloads visual-fill-column-autoloads vlf-autoloads
web-mode-autoloads wgrep-autoloads info with-editor-autoloads
yasnippet-autoloads package browse-url xdg url url-proxy url-privacy
url-expand url-methods url-history url-cookie generate-lisp-file
url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv
bytecomp byte-compile url-vars cus-edit pp cus-load icons wid-edit
cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren electric
uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/ns-win ns-win ucs-normalize mule-util term/common-win tool-bar 
dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar 
rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock 
syntax
font-core term/tty-colors frame minibuffer nadvice seq simple 
cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew 
greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button 
loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget 
keymap
hashtable-print-readable backquote threads kqueue cocoa ns lcms2
multi-tty make-network-process tty-child-frames native-compile emacs)

Memory information:
((conses 16 1803990 875857) (symbols 48 77782 251)
(strings 32 482648 48041) (string-bytes 1 17613760)
(vectors 16 335374) (vector-slots 8 3288698 315201)
(floats 8 93173 12900) (intervals 56 45785 14632) (buffers 992 62))

-- 
Best regards, Roman




Reply sent to Yuan Fu <casouri <at> gmail.com>:
You have taken responsibility. (Wed, 07 May 2025 04:32:02 GMT) Full text and rfc822 format available.

Notification sent to Roman Rudakov <rrudakov <at> fastmail.com>:
bug acknowledged by developer. (Wed, 07 May 2025 04:32:02 GMT) Full text and rfc822 format available.

Message #10 received at 78065-done <at> debbugs.gnu.org (full text, mbox):

From: Yuan Fu <casouri <at> gmail.com>
To: Roman Rudakov <rrudakov <at> fastmail.com>
Cc: 78065-done <at> debbugs.gnu.org
Subject: Re: bug#78065: 31.0.50; treesit-simple-indent-rules: nth-sibling
 anchor preset doesn't work properly
Date: Tue, 6 May 2025 21:30:49 -0700

> On Apr 25, 2025, at 12:04 PM, Roman Rudakov <rrudakov <at> fastmail.com> wrote:
> 
> 
> The bug itself is actually in 'treesit--simple-indent-eval' function.
> 
> Steps to reproduce:
> 
> Eval the following expression:
> (treesit--simple-indent-eval '(nth-sibling 1 t))
> 
> Expected result: anchor lambda is returned.
> 
> Actual result:
> 
> Debugger entered--Lisp error: (treesit-indent-error "Couldn't find the preset corresponding to expression" t)
> 
> The function 'treesit--simple-indent-eval' is called recursively for every element in the expression, at some point it's called for 't', which matches '(symbolp exp)' predicate and is not null, which causes the error.

Hey Roman, thank you for the report, and sorry for taking so long to reply.

I initially added a branch cases to allow exp to be t, but then I realized that there’s no point inhibiting exp from being an arbitrary symbol or keyword, since user can define indent presets that takes a symbol or keyword as argument. So I went a step further and removed the check.

I pushed the fix to emacs-30.

Yuan



Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#78065; Package emacs. (Wed, 07 May 2025 07:40:01 GMT) Full text and rfc822 format available.

Message #13 received at 78065-done <at> debbugs.gnu.org (full text, mbox):

From: Roman Rudakov <rrudakov <at> fastmail.com>
To: Yuan Fu <casouri <at> gmail.com>
Cc: 78065-done <at> debbugs.gnu.org
Subject: Re: bug#78065: 31.0.50; treesit-simple-indent-rules: nth-sibling
 anchor preset doesn't work properly
Date: Wed, 07 May 2025 09:39:24 +0200
Yuan Fu <casouri <at> gmail.com> writes:

>> On Apr 25, 2025, at 12:04 PM, Roman Rudakov <rrudakov <at> fastmail.com> 
>> wrote:
>>
>>
>> The bug itself is actually in 'treesit--simple-indent-eval' 
>> function.
>>
>> Steps to reproduce:
>>
>> Eval the following expression:
>> (treesit--simple-indent-eval '(nth-sibling 1 t))
>>
>> Expected result: anchor lambda is returned.
>>
>> Actual result:
>>
>> Debugger entered--Lisp error: (treesit-indent-error "Couldn't find 
>> the preset corresponding to expression" t)
>>
>> The function 'treesit--simple-indent-eval' is called recursively 
>> for every element in the expression, at some point it's called for 
>> 't', which matches '(symbolp exp)' predicate and is not null, which 
>> causes the error.
>
> Hey Roman, thank you for the report, and sorry for taking so long to 
> reply.
>
> I initially added a branch cases to allow exp to be t, but then I
> realized that there’s no point inhibiting exp from being an 
> arbitrary
> symbol or keyword, since user can define indent presets that takes a
> symbol or keyword as argument. So I went a step further and removed
> the check.
>
> I pushed the fix to emacs-30.
>
> Yuan
Thank you!
--
Best regards, Roman




This bug report was last modified 17 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.