From 3b587415224e2aa14280ea1e4a1ab3935449f40d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Aug 2025 00:35:39 +0200 Subject: [PATCH] refactor(tree-sitter): centralize grammar config & hacks Easier to track and maintain. --- modules/lang/cc/config.el | 16 ++--- modules/lang/clojure/config.el | 1 - modules/lang/csharp/config.el | 17 +---- modules/lang/elixir/config.el | 10 +-- modules/lang/go/config.el | 5 +- modules/lang/janet/config.el | 7 +- modules/lang/json/config.el | 4 +- modules/lang/julia/config.el | 4 +- modules/lang/lua/config.el | 4 +- modules/lang/markdown/config.el | 9 +-- modules/lang/php/config.el | 10 +-- modules/lang/python/config.el | 14 +--- modules/lang/ruby/config.el | 3 +- modules/lang/yaml/config.el | 7 +- modules/lang/zig/config.el | 3 - modules/tools/docker/config.el | 7 +- .../tools/tree-sitter/autoload/tree-sitter.el | 39 +++++++---- modules/tools/tree-sitter/config.el | 67 +++++++++++-------- 18 files changed, 85 insertions(+), 142 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index a5ffeb737..0af20dedf 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -30,10 +30,8 @@ This is ignored by ccls.") :hook (c-mode-common . rainbow-delimiters-mode) :init (when (modulep! +tree-sitter) - (set-tree-sitter! 'c-mode 'c-ts-mode - '((c :url "https://github.com/tree-sitter/tree-sitter-c"))) - (set-tree-sitter! 'c++-mode 'c++-ts-mode - '((cpp :url "https://github.com/tree-sitter/tree-sitter-cpp")))) + (set-tree-sitter! 'c-mode 'c-ts-mode 'c) + (set-tree-sitter! 'c++-mode 'c++-ts-mode 'cpp)) :config (set-docsets! '(c-mode c-ts-mode) "C") @@ -116,8 +114,7 @@ This is ignored by ccls.") :init (when (and (modulep! +tree-sitter) (boundp 'cmake-ts-mode)) ; 29+ only - (set-tree-sitter! 'cmake-mode 'cmake-ts-mode - '((cmake :url "https://github.com/uyha/tree-sitter-cmake")))) + (set-tree-sitter! 'cmake-mode 'cmake-ts-mode 'cmake)) :config (set-docsets! '(cmake-mode cmake-ts-mode) "CMake") (set-popup-rule! "^\\*CMake Help\\*" :size 0.4 :ttl t) @@ -160,12 +157,7 @@ This is ignored by ccls.") '((cuda :url "https://github.com/tree-sitter-grammars/tree-sitter-cuda"))) :config (when (modulep! +lsp) - (add-hook 'cuda-ts-mode-local-vars-hook #'lsp! 'append)) - ;; HACK: Remove redundant entries so we can rely solely on - ;; `major-mode-remap-defaults' et co. - (rassq-delete-all 'cuda-ts-mode auto-mode-alist) - (cl-callf2 delete '(cuda "https://github.com/tree-sitter-grammars/tree-sitter-cuda" nil nil nil nil) - treesit-language-source-alist)) + (add-hook 'cuda-ts-mode-local-vars-hook #'lsp! 'append))) (use-package! demangle-mode diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index d3cd41387..dd3206aec 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -62,7 +62,6 @@ ;; HACK: Rely on `major-mode-remap-defaults' instead (upstream also doesn't ;; check if the grammars are ready before adding these entries, which will ;; bork clojure buffers. - (cl-callf2 rassq-delete-all 'clojure-ts-mode auto-mode-alist) (cl-callf2 rassq-delete-all 'clojure-ts-clojurescript-mode auto-mode-alist) (cl-callf2 rassq-delete-all 'clojure-ts-clojurec-mode auto-mode-alist) (cl-callf2 rassq-delete-all 'clojure-ts-clojuredart-mode auto-mode-alist) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 08f99fab2..70a4a9884 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -2,6 +2,9 @@ (use-package! csharp-mode :hook (csharp-mode . rainbow-delimiters-mode) + :init + (when (modulep! +tree-sitter) + (set-tree-sitter! 'csharp-mode 'csharp-ts-mode 'c-sharp)) :config (set-formatter! 'csharpier '("csharpier" "format" "--write-stdout") :modes '(csharp-mode csharp-ts-mode)) @@ -38,26 +41,12 @@ (add-hook 'csharp-mode-local-vars-hook #'lsp! 'append) (add-hook 'csharp-ts-mode-local-vars-hook #'lsp! 'append)) - (when (and (modulep! +tree-sitter) - (fboundp 'csharp-ts-mode)) ; 29.1+ only - (set-tree-sitter! 'csharp-mode 'csharp-ts-mode - '((c-sharp :url "https://github.com/tree-sitter/tree-sitter-c-sharp" - :rev "v0.23.1")))) - (defadvice! +csharp-disable-clear-string-fences-a (fn &rest args) "This turns off `c-clear-string-fences' for `csharp-mode'. When on for `csharp-mode' font lock breaks after an interpolated string or terminating simple string." :around #'csharp-disable-clear-string-fences (unless (eq major-mode 'csharp-mode) - (apply fn args))) - - ;; HACK: `csharp-ts-mode' changes `auto-mode-alist' every time the mode is - ;; activated, which runs the risk of overwriting user (or Doom) entries. - ;; REVIEW: Should be addressed upstream. - (defadvice! +csharp--undo-ts-side-effects-a (fn &rest args) - :around #'csharp-ts-mode - (let (auto-mode-alist) (apply fn args)))) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 6572fc195..81bd247dd 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -59,16 +59,8 @@ :when (fboundp 'elixir-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'elixir-mode 'elixir-ts-mode - '((elixir :url "https://github.com/elixir-lang/tree-sitter-elixir" - :rev "v0.3.3") - (heex :url "https://github.com/phoenixframework/tree-sitter-heex" - :rev "v0.7.0"))) + (set-tree-sitter! 'elixir-mode 'elixir-ts-mode '(elixir heex)) :config - ;; HACK: Rely on `major-mode-remap-defaults' (and elixir-mode's autoloaded - ;; auto-mode-alist entries). - (cl-callf2 rassq-delete-all 'elixir-ts-mode auto-mode-alist) - (+elixir-common-config 'elixir-ts-mode)) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 469f5189b..d526f2fc8 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -53,10 +53,7 @@ :when (fboundp 'go-ts-mode) ; 31.1+ only :defer t :init - (set-tree-sitter! 'go-mode 'go-ts-mode - '((go :url "https://github.com/tree-sitter/tree-sitter-go" :ref "v0.23.4") - (gomod :url "https://github.com/camdencheek/tree-sitter-go-mod" :ref "v1.1.0") - (gowork :url "https://github.com/omertuc/tree-sitter-go-work"))) + (set-tree-sitter! 'go-mode 'go-ts-mode '(go gomod gowork)) :config (+go-common-config 'go-ts-mode)) diff --git a/modules/lang/janet/config.el b/modules/lang/janet/config.el index 00c4f0a42..fa49da13a 100644 --- a/modules/lang/janet/config.el +++ b/modules/lang/janet/config.el @@ -30,9 +30,4 @@ :init (set-tree-sitter! 'janet-mode 'janet-ts-mode `(janet-simple :url "https://github.com/sogaiu/tree-sitter-janet-simple" - :cc ,(if (featurep :system 'windows) "gcc.exe"))) - :config - ;; HACK: These entries are inserted twice by this package, so remove them so - ;; this module can be the single source of truth. - (cl-callf2 rassq-delete-all 'janet-ts-mode auto-mode-alist) - (cl-callf2 rassq-delete-all 'janet-ts-mode interpreter-mode-alist)) + :cc ,(if (featurep :system 'windows) "gcc.exe")))) diff --git a/modules/lang/json/config.el b/modules/lang/json/config.el index 3f9fe6529..a2d385c56 100644 --- a/modules/lang/json/config.el +++ b/modules/lang/json/config.el @@ -25,9 +25,7 @@ :when (fboundp 'json-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'json-mode 'json-ts-mode - '((json :url "https://github.com/tree-sitter/tree-sitter-json" - :rev "v0.24.8"))) + (set-tree-sitter! 'json-mode 'json-ts-mode 'json) :config ;; HACK: Rely on `major-mode-remap-defaults'. (cl-callf2 assq-delete-all 'json-ts-mode auto-mode-alist) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 5e944741f..43ae499b3 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -48,9 +48,7 @@ :when (modulep! +tree-sitter) :defer t :init - (set-tree-sitter! 'julia-mode 'julia-ts-mode - '((julia :url "https://github.com/tree-sitter/tree-sitter-julia" - :rev "v0.23.1"))) + (set-tree-sitter! 'julia-mode 'julia-ts-mode 'julia) :config (when (modulep! +lsp) (add-hook 'julia-ts-mode-local-vars-hook #'lsp! 'append))) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 91d95c307..e57d8a150 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -30,9 +30,7 @@ :when (fboundp 'lua-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'lua-mode 'lua-ts-mode - '((lua :url "https://github.com/tree-sitter-grammars/tree-sitter-lua" - :rev "v0.3.0"))) + (set-tree-sitter! 'lua-mode 'lua-ts-mode 'lua) :config (set-lookup-handlers! 'lua-ts-mode :documentation 'lua-search-documentation) (set-electric! 'lua-ts-mode :words '("else" "end")) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 6f5e2111e..9fea6ecad 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -131,14 +131,7 @@ capture, the end position, and the output buffer.") :when (fboundp 'markdown-ts-mode) :defer t :init - (set-tree-sitter! 'markdown-mode 'markdown-ts-mode - '((markdown :url "https://github.com/tree-sitter-grammars/tree-sitter-markdown" - :rev "v0.4.1" - :source-dir "tree-sitter-markdown-inline/src") - (markdown-inline :url "https://github.com/tree-sitter-grammars/tree-sitter-markdown" - :rev "v0.4.1" - :source-dir "tree-sitter-markdown-inline/src"))) - + (set-tree-sitter! 'markdown-mode 'markdown-ts-mode '(markdown markdown-inline)) :config (cl-callf2 delete '("\\.md\\'" . markdown-ts-mode) auto-mode-alist)) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index fe7460e0f..e96d23683 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -83,16 +83,8 @@ :when (fboundp 'php-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'php-mode 'php-ts-mode - '((php :url "https://github.com/tree-sitter/tree-sitter-php" - :rev "v0.23.11" - :source-dir "php/src") - (phpdoc :url "https://github.com/claytonrcarter/tree-sitter-phpdoc"))) + (set-tree-sitter! 'php-mode 'php-ts-mode '(php phpdoc)) :config - ;; HACK: Rely on `major-mode-remap-defaults'. - (cl-callf2 rassq-delete-all 'php-ts-mode auto-mode-alist) - (cl-callf2 rassq-delete-all 'php-ts-mode interpreter-mode-alist) - (+php-common-config 'php-ts-mode)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 1e61c960c..44360d038 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -20,8 +20,7 @@ python-indent-guess-indent-offset-verbose nil) (when (modulep! +tree-sitter) - (set-tree-sitter! 'python-mode 'python-ts-mode - '((python :url "https://github.com/tree-sitter/tree-sitter-python")))) + (set-tree-sitter! 'python-mode 'python-ts-mode 'python)) :config ;; HACK: `python-base-mode' (and `python-ts-mode') don't exist on pre-29 @@ -98,16 +97,7 @@ ;; HACK: `python-mode' doesn't update `tab-width' to reflect ;; `python-indent-offset', causing issues anywhere `tab-width' is respected. - (setq-hook! '(python-mode-hook python-ts-mode-hook) tab-width python-indent-offset) - - ;; HACK: `python-ts-mode' changes `auto-mode-alist' and - ;; `interpreter-mode-alist' every time the mode is activated, which runs the - ;; risk of overwriting user (or Doom) entries. - ;; REVIEW: Should be addressed upstream. - (defadvice! +python--undo-ts-side-effects-a (fn &rest args) - :around #'python-ts-mode - (let (auto-mode-alist interpreter-mode-alist) - (apply fn args)))) + (setq-hook! '(python-mode-hook python-ts-mode-hook) tab-width python-indent-offset)) (use-package! pyimport diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0721167aa..0ef6d3e66 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -41,8 +41,7 @@ :when (fboundp 'ruby-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'ruby-mode 'ruby-ts-mode - '((ruby :url "https://github.com/tree-sitter/tree-sitter-ruby"))) + (set-tree-sitter! 'ruby-mode 'ruby-ts-mode 'ruby) :config (set-electric! 'ruby-ts-mode :words '("else" "end" "elsif")) (set-repl-handler! 'ruby-ts-mode #'inf-ruby) diff --git a/modules/lang/yaml/config.el b/modules/lang/yaml/config.el index 8a5cbb90f..9f139313a 100644 --- a/modules/lang/yaml/config.el +++ b/modules/lang/yaml/config.el @@ -12,12 +12,7 @@ :when (modulep! +tree-sitter) :when (fboundp 'yaml-ts-mode) ; 29.1+ only :init - (set-tree-sitter! 'yaml-mode 'yaml-ts-mode - '((yaml :url "https://github.com/tree-sitter-grammars/tree-sitter-yaml" - :rev "v0.7.0"))) + (set-tree-sitter! 'yaml-mode 'yaml-ts-mode 'yaml) :config - ;; HACK: Rely on `major-mode-remap-defaults'. - (cl-callf2 rassq-delete-all 'yaml-ts-mode auto-mode-alist) - (when (modulep! +lsp) (add-hook 'yaml-ts-mode-local-vars-hook #'lsp! 'append))) diff --git a/modules/lang/zig/config.el b/modules/lang/zig/config.el index 52adc3bf2..7fe3d90e7 100644 --- a/modules/lang/zig/config.el +++ b/modules/lang/zig/config.el @@ -47,7 +47,4 @@ '((zig :url "https://github.com/tree-sitter/zig-tree-sitter" :rev "v0.25.0"))) :config - ;; HACK: Rely on `major-mode-remap-defaults' - (cl-callf2 rassq-delete-all 'zig-ts-mode auto-mode-alist) - (+zig-common-config 'zig-ts-mode)) diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index 3e523be48..6029a6c3c 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -13,9 +13,4 @@ :when (fboundp 'dockerfile-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'dockerfile-mode 'dockerfile-ts-mode - '((dockerfile :url "https://github.com/camdencheek/tree-sitter-dockerfile" - :rev "v0.2.0"))) - :config - ;; HACK: Rely on `major-mode-remap-defaults' instead - (cl-callf2 rassq-delete-all 'dockerfile-ts-mode auto-mode-alist)) + (set-tree-sitter! 'dockerfile-mode 'dockerfile-ts-mode 'dockerfile)) diff --git a/modules/tools/tree-sitter/autoload/tree-sitter.el b/modules/tools/tree-sitter/autoload/tree-sitter.el index b3dde5490..5df7c4bdf 100644 --- a/modules/tools/tree-sitter/autoload/tree-sitter.el +++ b/modules/tools/tree-sitter/autoload/tree-sitter.el @@ -15,10 +15,11 @@ 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. -RECIPES are an alist of plists with the format (LANG &key URL REV SOURCE-DIR CC -CPP COMMIT), which will be transformed into entries for -`treesit-language-source-alist' (which descrie what each of these keys mean). -Note that COMMIT is only available in Emacs >=31." +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 +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 symbol) (cl-check-type ts-mode symbol) @@ -41,6 +42,11 @@ Note that COMMIT is only available in Emacs >=31." (fboundp ts-mode) (or (eq treesit-enabled-modes t) (memq ts-mode treesit-enabled-modes)) + ;; Lazily load autoload so + ;; `treesit-language-source-alist' is initialized. + (let ((fn (symbol-function ts-mode))) + (or (not (autoloadp fn)) + (autoload-do-load fn))) ;; Only prompt once, and log other times. (cl-every (if ensured? (doom-rpartial #'treesit-ready-p 'message) @@ -54,16 +60,16 @@ Note that COMMIT is only available in Emacs >=31." m)))))))) (with-eval-after-load 'treesit (dolist (recipe recipes) - (cl-destructuring-bind (name &key url rev source-dir cc cpp commit) - (ensure-list recipe) - (setf (alist-get name treesit-language-source-alist) - (append (list url rev source-dir cc cpp) - ;; COMPAT: 31.1 introduced a COMMIT recipe argument. On - ;; <=30.x, extra arguments will trigger an arity error - ;; when installing grammars. - (if (eq (cdr (func-arity 'treesit--install-language-grammar-1)) - 'many) - (list commit)))))))) + (when (cdr (setq recipe (ensure-list recipe))) + (cl-destructuring-bind (name &key url rev source-dir cc cpp commit) recipe + (setf (alist-get name treesit-language-source-alist) + (append (list url rev source-dir cc cpp) + ;; COMPAT: 31.1 introduced a COMMIT recipe argument. On + ;; <=30.x, extra arguments will trigger an arity error + ;; when installing grammars. + (if (eq (cdr (func-arity 'treesit--install-language-grammar-1)) + 'many) + (list commit))))))))) ;; ;; HACK: Remove and refactor when `use-package' eager macro expansion is solved or `use-package!' is removed ;; ;;;###autoload @@ -81,6 +87,11 @@ Note that COMMIT is only available in Emacs >=31." ;; (evil-textobj-tree-sitter-goto-textobj group previous end query))) ;; sym)) +;;;###autoload +(defun +tree-sitter-ts-mode-inhibit-side-effects-a (fn &rest args) + "Suppress changes to `auto-mode-alist' and `interpreter-mode-alist'." + (let (auto-mode-alist interpreter-mode-alist) + (apply fn args))) ;;; TODO: Backwards compatibility diff --git a/modules/tools/tree-sitter/config.el b/modules/tools/tree-sitter/config.el index 4c2cd9133..b6c5c91e4 100644 --- a/modules/tools/tree-sitter/config.el +++ b/modules/tools/tree-sitter/config.el @@ -10,38 +10,42 @@ :preface (setq treesit-enabled-modes t) - ;; HACK: These *-ts-mode-maybe functions all treat `treesit-enabled-modes' - ;; strangely in the event the language's grammar is unavailable. Plus, they - ;; add yet-another-layer of complexity for users to be cognicent of. Get rid - ;; of them. - ;; REVIEW: Handle this during the 'doom sync' process instead. - (setq auto-mode-alist - (save-match-data - (cl-loop for (src . fn) in auto-mode-alist - unless (and (functionp fn) - (string-match "-ts-mode-maybe$" (symbol-name fn))) - collect (cons src fn)))) + ;; HACK: The *-ts-mode major modes are inconsistent about how they treat + ;; missing language grammars (some error out, some respect + ;; `treesit-auto-install-grammar', some fall back to `fundamental-mode'). + ;; I'd like to address this poor UX using `major-mode-remap-alist' entries + ;; created by `set-tree-sitter!' (which will fall back to the non-treesit + ;; modes), but most *-ts-mode's clobber `auto-mode-alist' and/or + ;; `interpreter-mode-alist' each time the major mode is activated, so those + ;; must be undone too so they don't overwrite user config. + ;; TODO: Handle this during the 'doom sync' process instead. + (save-match-data + (dolist (sym '(auto-mode-alist interpreter-mode-alist)) + (set + sym (cl-loop for (src . fn) in (symbol-value sym) + unless (and (functionp fn) + (string-match "-ts-mode\\(?:-maybe\\)?$" (symbol-name fn))) + collect (cons src fn))))) + + ;; HACK: These *-ts-modes change `auto-mode-alist' and/or + ;; `interpreter-mode-alist' every time they are activated, running the risk + ;; of overwriting user (or Doom) config. + ;; REVIEW: Should be addressed upstream. + (dolist (mode '(csharp-ts-mode + python-ts-mode)) + (advice-add mode :around #'+tree-sitter-ts-mode-inhibit-side-effects-a)) :config ;; HACK: The implementation of `treesit-enabled-modes's setter and - ;; `treesit-major-mode-remap-alist' are intrusively opinionated, so I - ;; disable it altogether as to not unexpectedly modify - ;; `major-mode-remap-alist' at runtime. What's more, there's no guarantee - ;; this will be populated correctly unless the user is on a particular - ;; commit of Emacs 31 or newer. Best we simply ignore it. - (dolist (m treesit-major-mode-remap-alist) - (setq major-mode-remap-alist (delete m major-mode-remap-alist))) + ;; `treesit-major-mode-remap-alist' is intrusively opinionated, so disable + ;; it ato avoid untimely (and overriding) modifications of + ;; `major-mode-remap-alist' at runtime. What's more, this was only + ;; introduced in 31, so ignoring them is more consistent for pre-31 users. + (when major-mode-remap-alist + (dolist (m treesit-major-mode-remap-alist) + (setq major-mode-remap-alist (delete m major-mode-remap-alist)))) (setq treesit-major-mode-remap-alist nil) - ;; HACK: treesit lacks any way to dictate where to install grammars. - (add-to-list 'treesit-extra-load-path (concat doom-profile-data-dir "tree-sitter")) - (defadvice! +tree-sitter--install-grammar-to-local-dir-a (fn &rest args) - "Write grammars to `doom-profile-data-dir'." - :around #'treesit-install-language-grammar - :around #'treesit--build-grammar - (let ((user-emacs-directory doom-profile-data-dir)) - (apply fn args))) - ;; HACK: Some *-ts-mode packages modify `major-mode-remap-defaults' ;; inconsistently. Playing whack-a-mole to undo those changes is more hassle ;; then simply ignoring them (by overriding `major-mode-remap-defaults' for @@ -56,6 +60,15 @@ major-mode-remap-defaults))) (funcall fn mode))) + ;; HACK: Keep $EMACSDIR clean by installing grammars to the active profile. + (add-to-list 'treesit-extra-load-path (concat doom-profile-data-dir "tree-sitter")) + (defadvice! +tree-sitter--install-grammar-to-local-dir-a (fn &rest args) + "Write grammars to `doom-profile-data-dir'." + :around #'treesit-install-language-grammar + :around #'treesit--build-grammar + (let ((user-emacs-directory doom-profile-data-dir)) + (apply fn args))) + ;; TODO: Move most of these out to modules (dolist (map '((awk "https://github.com/Beaglefoot/tree-sitter-awk" nil nil nil nil) (bibtex "https://github.com/latex-lsp/tree-sitter-bibtex" nil nil nil nil)