From df10665d0c4b72619352e08ff6207da0cc0c3e2e Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Fri, 15 Dec 2023 14:55:22 +0000 Subject: [PATCH] fix(text-editing/treesit): resolve issues with treesit-auto package When the global-treesit-auto-mode is enabled, was getting lots of errors related to an infinite loop whenever opening a buffer supported by one of `*-ts-mode` modes. Instead, I now take a more manual and intentional approach to using the built-in treesit modes for specific languages. --- modules/languages/siren-dockerfile.el | 3 +++ modules/languages/siren-toml.el | 21 +++++++++--------- modules/languages/siren-typescript.el | 6 ++--- modules/text-editing/siren-treesit.el | 32 ++++++++++++++++++++++----- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/modules/languages/siren-dockerfile.el b/modules/languages/siren-dockerfile.el index 2e903ff..db0e20b 100644 --- a/modules/languages/siren-dockerfile.el +++ b/modules/languages/siren-dockerfile.el @@ -79,6 +79,9 @@ See URL `http://github.com/hadolint/hadolint/'." ;; :hook ;; (dockerfile-ts-mode . siren-dockerfile-mode-setup) ;; +;; :init +;; (siren-treesit-auto-ensure-grammar 'dockerfile) +;; ;; :config ;; (siren-flycheck-setup-hadolint) ;; diff --git a/modules/languages/siren-toml.el b/modules/languages/siren-toml.el index cbd5e31..ee88c8f 100644 --- a/modules/languages/siren-toml.el +++ b/modules/languages/siren-toml.el @@ -13,18 +13,19 @@ :mode "\\.toml\\'" "Cargo\\.lock\\'" :hook (conf-toml-mode . siren-toml-mode-setup)) -;; Use built-in treesit support if available. -(if (fboundp 'toml-ts-mode) - (use-package toml-ts-mode - :straight (:type built-in) - :mode "\\.toml\\'" "Cargo\\.lock\\'" - :hook - (toml-ts-mode . siren-toml-mode-setup) - - :init - (require 'siren-treesit))) +;; Requires Emacs 29.x or later for built-in treesit support. +(when (fboundp 'toml-ts-mode) + (require 'siren-treesit) + (use-package toml-ts-mode + :straight (:type built-in) + :mode "\\.toml\\'" "Cargo\\.lock\\'" + :hook + (toml-ts-mode . siren-toml-mode-setup) + :config + (siren-treesit-auto-ensure-grammar 'toml))) (defun siren-toml-mode-setup () + "Default tweaks for `toml-mode'." (run-hooks 'prog-mode-hook) (setq-local tab-width 2)) diff --git a/modules/languages/siren-typescript.el b/modules/languages/siren-typescript.el index fba207f..081b78d 100644 --- a/modules/languages/siren-typescript.el +++ b/modules/languages/siren-typescript.el @@ -19,15 +19,13 @@ (typescript-ts-mode . siren-typescript-mode-setup) :config - (when (not (treesit-ready-p 'typescript)) - (treesit-install-language-grammar 'typescript))) + (siren-treesit-auto-ensure-grammar 'typescript)) (use-package tsx-ts-mode :straight (:type built-in) :mode "\\.tsx\\'" :config - (when (not (treesit-ready-p 'tsx)) - (treesit-install-language-grammar 'tsx))) + (siren-treesit-auto-ensure-grammar 'tsx)) (defun siren-typescript-mode-setup () "Default setup function for `typescript-ts-mode' and `tsx-ts-mode'." diff --git a/modules/text-editing/siren-treesit.el b/modules/text-editing/siren-treesit.el index 0cc6939..8ee5d08 100644 --- a/modules/text-editing/siren-treesit.el +++ b/modules/text-editing/siren-treesit.el @@ -13,21 +13,43 @@ (when (fboundp 'treesit-ready-p) (setopt treesit-font-lock-level 4) - (defun siren-treesit-prepare (mode source) + (defun siren-treesit-manual-prepare (mode source) "Setup treesit for MODE with SOURCE." (add-to-list 'treesit-language-source-alist source) (let ((lang (car source))) - (advice-add mode :before `(lambda (&rest _) - (when (not (treesit-ready-p ',lang)) - (treesit-install-language-grammar ',lang)))))) + (advice-add mode :before + `(lambda (&rest _) + (when (not (treesit-ready-p ',lang t)) + (treesit-install-language-grammar ',lang)))))) (use-package treesit-auto :demand t :if (fboundp 'treesit-ready-p) :custom (treesit-auto-install nil) + + :preface + (defun siren-treesit-auto-ensure-grammar (grammar) + "Ensure that treesit GRAMMAR is installed and ready for use." + (when (and (fboundp 'treesit-ready-p) + (not (treesit-ready-p grammar t))) + (let ((treesit-language-source-alist + (treesit-auto--build-treesit-source-alist))) + (treesit-install-language-grammar grammar)))) + + (defvar siren-treesit-auto--source-alist-populated-p 'nil + "Internal flag to track if `treesit-auto--build-treesit-source-alist' +has been used to populate `treesit-language-source-alist'.") + + (defun siren-treesit-auto--populate-treesit-language-source-alist () + (if (not siren-treesit-auto--source-alist-populated-p) + (setq treesit-language-source-alist + (append treesit-language-source-alist + (treesit-auto--build-treesit-source-alist)) + siren-treesit-auto--source-alist-populated-p t))) + :config - (global-treesit-auto-mode))) + (siren-treesit-auto--populate-treesit-language-source-alist))) (provide 'siren-treesit) ;;; siren-treesit.el ends here