From 1adec8b10c23aa79d709b2781b62e5c5495c9d09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Sep 2025 10:21:10 -0400 Subject: [PATCH] fix(tree-sitter): add derived-mode parents to ts-modes ts-modes do this already in 30/31+ (`derived-mode-add-parents` was added in 30), but is still needed for 29.x users and any ts-modes that haven't adapted (many of them). Fix: doomemacs/community#29 --- modules/editor/file-templates/config.el | 3 ++- modules/tools/lookup/autoload/lookup.el | 1 + .../tools/tree-sitter/autoload/tree-sitter.el | 22 ++++++++++++------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/editor/file-templates/config.el b/modules/editor/file-templates/config.el index 30aab1b07..2d95a6d6a 100644 --- a/modules/editor/file-templates/config.el +++ b/modules/editor/file-templates/config.el @@ -132,7 +132,8 @@ information.") (let ((pred (car rule)) (plist (cdr rule))) (and (or (and (symbolp pred) - (eq major-mode pred)) + (or (eq major-mode pred) + (memq pred (get major-mode 'derived-mode-extra-parents)))) (and (stringp pred) (stringp buffer-file-name) (string-match-p pred buffer-file-name))) diff --git a/modules/tools/lookup/autoload/lookup.el b/modules/tools/lookup/autoload/lookup.el index bf001989d..1ce100506 100644 --- a/modules/tools/lookup/autoload/lookup.el +++ b/modules/tools/lookup/autoload/lookup.el @@ -95,6 +95,7 @@ This can be passed nil as its second argument to unset handlers for MODES. e.g. 'xref-backend-functions) (make-list 5 async) (make-list 5 (or (eq major-mode mode) + (memq mode (get major-mode 'derived-mode-extra-parents)) (and (boundp mode) (symbol-value mode)))))))) (add-hook hook fn))))) diff --git a/modules/tools/tree-sitter/autoload/tree-sitter.el b/modules/tools/tree-sitter/autoload/tree-sitter.el index 892e5fd04..66a84c1b9 100644 --- a/modules/tools/tree-sitter/autoload/tree-sitter.el +++ b/modules/tools/tree-sitter/autoload/tree-sitter.el @@ -5,12 +5,13 @@ (message "Old tree-sitter.el support is deprecated!")) ;;;###autodef (fset 'set-tree-sitter! #'ignore) -(defun set-tree-sitter! (mode ts-mode &optional recipes) - "Remap major MODE to TS-MODE. +(defun set-tree-sitter! (modes ts-mode &optional recipes) + "Remap major MODES to TS-MODE. -MODE and TS-MODE are major mode symbols. If RECIPES is provided, fall back to -MODE if RECIPES don't pass `treesit-ready-p' when activating TS-MODE. Use this -for ts modes that error out instead of failing gracefully. +MODES and TS-MODE are major mode symbols. MODES can be a list thereof. If +RECIPES is provided, fall back to MODES if RECIPES don't pass `treesit-ready-p' +when activating TS-MODE. Use this for ts modes that error out instead of failing +gracefully. RECIPES is a symbol (a grammar language name), list thereof, or alist of plists with the format (LANG &key URL REV SOURCE-DIR CC CPP COMMIT). If an alist of @@ -18,10 +19,15 @@ plists, it will be transformed into entries for `treesit-language-source-alist' (which describe what each of these keys mean). Note that COMMIT is ignored pre-Emacs 31." (declare (indent 2)) - (cl-check-type mode (or list symbol)) + (cl-check-type modes (or list symbol)) (cl-check-type ts-mode symbol) - (let ((recipes (mapcar #'ensure-list (ensure-list recipes)))) - (dolist (m (or (ensure-list mode) (list nil))) + (let ((recipes (mapcar #'ensure-list (ensure-list recipes))) + (modes (ensure-list modes))) + (when modes + ;; Most ts-modes do not register their base modes as parents until Emacs + ;; 30/31; this backports that. + (put ts-mode 'derived-mode-extra-parents modes)) + (dolist (m (or modes (list nil))) (when m (setf (alist-get m major-mode-remap-defaults) ts-mode)) (put ts-mode '+tree-sitter (cons m (mapcar #'car recipes))))