From d545fccf47b64faf8b19f6fdab3fbb7c23a377cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Aug 2025 12:47:50 +0200 Subject: [PATCH] fix(:lang): missing grammar recipes I removed the grammar recipes in 3b58741 to avoid redundancy with the upstream recipes, but didn't realize that those upstream recipes weren't added until Emacs 31, so users on 30 and older would get errors when trying to install any missing grammars. This also establishes a hard dependency between :lang (php +tree-sitter) and :lang ({javascript,web} +tree-sitter). Amend: 3b587415224e --- modules/lang/cc/config.el | 10 ++++++---- modules/lang/csharp/config.el | 6 +++++- modules/lang/elixir/config.el | 9 ++++++--- modules/lang/go/config.el | 8 +++++++- modules/lang/janet/config.el | 4 ++-- modules/lang/java/config.el | 9 ++++++--- modules/lang/javascript/config.el | 19 +++++++++++++------ modules/lang/json/config.el | 7 ++++--- modules/lang/julia/config.el | 3 ++- modules/lang/lua/config.el | 5 +++-- modules/lang/markdown/config.el | 3 +-- modules/lang/php/config.el | 11 +++++++++-- modules/lang/php/doctor.el | 16 +++++++++------- modules/lang/python/config.el | 4 +++- modules/lang/ruby/config.el | 7 ++++--- modules/lang/rust/config.el | 10 +++++++--- modules/lang/web/+css.el | 8 +++++--- modules/lang/web/+html.el | 11 ++++++----- modules/lang/yaml/config.el | 8 +++++--- modules/tools/docker/config.el | 5 +++-- modules/tools/tree-sitter/config.el | 2 +- 21 files changed, 107 insertions(+), 58 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 0af20dedf..2400ba17d 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -30,9 +30,10 @@ 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) - (set-tree-sitter! 'c++-mode 'c++-ts-mode 'cpp)) - + (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")))) :config (set-docsets! '(c-mode c-ts-mode) "C") (set-docsets! '(c++-mode c++-ts-mode) "C++" "Boost") @@ -114,7 +115,8 @@ 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)) + (set-tree-sitter! 'cmake-mode 'cmake-ts-mode + '((cmake :url "https://github.com/uyha/tree-sitter-cmake")))) :config (set-docsets! '(cmake-mode cmake-ts-mode) "CMake") (set-popup-rule! "^\\*CMake Help\\*" :size 0.4 :ttl t) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 70a4a9884..1b0dccd3f 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -2,9 +2,13 @@ (use-package! csharp-mode :hook (csharp-mode . rainbow-delimiters-mode) + :defer t :init (when (modulep! +tree-sitter) - (set-tree-sitter! 'csharp-mode 'csharp-ts-mode 'c-sharp)) + (set-tree-sitter! 'csharp-mode 'csharp-ts-mode + '((c-sharp :url "https://github.com/tree-sitter/tree-sitter-c-sharp" + :rev "v0.23.1" + :commit "362a8a41b265056592a0c3771664a21d23a71392")))) :config (set-formatter! 'csharpier '("csharpier" "format" "--write-stdout") :modes '(csharp-mode csharp-ts-mode)) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 81bd247dd..18aff5df5 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -54,12 +54,15 @@ highlight-numbers-modelist))) -(use-package! elixir-ts-mode +(use-package! elixir-ts-mode ; 30.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'elixir-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'elixir-mode 'elixir-ts-mode '(elixir heex)) + (set-tree-sitter! 'elixir-mode 'elixir-ts-mode + '((elixir :url "https://github.com/elixir-lang/tree-sitter-elixir" + :commit "02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e") + (heex :url "https://github.com/phoenixframework/tree-sitter-heex" + :commit "f6b83f305a755cd49cf5f6a66b2b789be93dc7b9"))) :config (+elixir-common-config 'elixir-ts-mode)) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 0d5c468f1..387c1ee97 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -53,7 +53,13 @@ :when (fboundp 'go-ts-mode) ; 31.1+ only :defer t :init - (set-tree-sitter! 'go-mode 'go-ts-mode '(go gomod gowork)) + (set-tree-sitter! 'go-mode 'go-ts-mode + '((go :url "https://github.com/tree-sitter/tree-sitter-go" + :commit "12fe553fdaaa7449f764bc876fd777704d4fb752") + (gomod :url "https://github.com/camdencheek/tree-sitter-go-mod" + :commit "3b01edce2b9ea6766ca19328d1850e456fde3103") + (gowork :url "https://github.com/omertuc/tree-sitter-go-work" + :commit "949a8a470559543857a62102c84700d291fc984c"))) :config (+go-common-config 'go-ts-mode)) diff --git a/modules/lang/janet/config.el b/modules/lang/janet/config.el index fa49da13a..f1564a68e 100644 --- a/modules/lang/janet/config.el +++ b/modules/lang/janet/config.el @@ -29,5 +29,5 @@ :defer t :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")))) + `((janet-simple :url "https://github.com/sogaiu/tree-sitter-janet-simple" + :cc ,(if (featurep :system 'windows) "gcc.exe"))))) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 1dab9a892..e6a983a89 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -34,12 +34,15 @@ If the depth is 2, the first two directories are removed: net.lissner.game.") ;; ;;; Common packages -(use-package! java-ts-mode +(use-package! java-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'java-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'java-mode 'java-ts-mode '(java doxygen))) + (set-tree-sitter! 'java-mode 'java-ts-mode + '((java :url "https://github.com/tree-sitter/tree-sitter-java" + :commit "94703d5a6bed02b98e438d7cad1136c01a60ba2c") + (doxygen :url "https://github.com/tree-sitter-grammars/tree-sitter-doxygen" + :commit "1e28054cb5be80d5febac082706225e42eff14e6")))) (use-package! android-mode diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 4496d98e0..835bb0c10 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -52,12 +52,17 @@ (+javascript-common-config 'js-mode)) -(use-package! js-ts-mode +(use-package! js-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'js-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'js-mode 'js-ts-mode 'javascript) + (set-tree-sitter! 'js-mode 'js-ts-mode + '((javascript :url "https://github.com/tree-sitter/tree-sitter-javascript" + :rev "v0.23.0" + :commit "108b2d4d17a04356a340aea809e4dd5b801eb40d") + (jsdoc :url "https://github.com/tree-sitter/tree-sitter-jsdoc" + :rev "v0.23.0" + :commit "b253abf68a73217b7a52c0ec254f4b6a7bb86665"))) (+javascript-common-config 'js-ts-mode)) @@ -68,12 +73,14 @@ (+javascript-common-config 'typescript-mode)) -(use-package! typescript-ts-mode +(use-package! typescript-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'typescript-ts-mode) ; 29.1+ only :mode "\\.ts\\'" :init - (set-tree-sitter! 'typescript-mode 'typescript-ts-mode 'typescript) + (set-tree-sitter! 'typescript-mode 'typescript-ts-mode + '((typescript :url "https://github.com/tree-sitter/tree-sitter-typescript" + :commit "8e13e1db35b941fc57f2bd2dd4628180448c17d5" + :source-dir "typescript/src"))) :config (+javascript-common-config 'typescript-ts-mode)) diff --git a/modules/lang/json/config.el b/modules/lang/json/config.el index 88d6889b4..c4b56b82d 100644 --- a/modules/lang/json/config.el +++ b/modules/lang/json/config.el @@ -20,12 +20,13 @@ "f" #'json-mode-beautify)) -(use-package! json-ts-mode +(use-package! json-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'json-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'json-mode 'json-ts-mode 'json) + (set-tree-sitter! 'json-mode 'json-ts-mode + '((json :url "https://github.com/tree-sitter/tree-sitter-json" + :commit "4d770d31f732d50d3ec373865822fbe659e47c75"))) :config (when (modulep! +lsp) (add-hook 'json-ts-mode-local-vars-hook #'lsp! 'append))) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 43ae499b3..99850f6f1 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -48,7 +48,8 @@ :when (modulep! +tree-sitter) :defer t :init - (set-tree-sitter! 'julia-mode 'julia-ts-mode 'julia) + (set-tree-sitter! 'julia-mode 'julia-ts-mode + '((julia :url "https://github.com/tree-sitter/tree-sitter-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 f082eceb3..f176fddbc 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -28,10 +28,11 @@ (use-package! lua-ts-mode :when (modulep! +tree-sitter) - :when (fboundp 'lua-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'lua-mode 'lua-ts-mode 'lua) + (set-tree-sitter! 'lua-mode 'lua-ts-mode + '((lua :url "https://github.com/tree-sitter-grammars/tree-sitter-lua" + :commit "db16e76558122e834ee214c8dc755b4a3edc82a9"))) :config (+lua-common-config 'lua-ts-mode)) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index f1e5dde26..782182c33 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -126,9 +126,8 @@ capture, the end position, and the output buffer.") :desc "GFM checkbox" "x" #'markdown-toggle-gfm-checkbox))) -(use-package! markdown-ts-mode +(use-package! markdown-ts-mode ; 31+ only :when (modulep! +tree-sitter) - :when (fboundp 'markdown-ts-mode) :defer t :init (set-tree-sitter! 'markdown-mode 'markdown-ts-mode '(markdown markdown-inline))) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 40902debc..e15c0bfbb 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -79,10 +79,17 @@ (use-package! php-ts-mode :when (modulep! +tree-sitter) - :when (fboundp 'php-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'php-mode 'php-ts-mode '(php phpdoc)) + (set-tree-sitter! 'php-mode 'php-ts-mode + '((php :url "https://github.com/tree-sitter/tree-sitter-php" + :rev "v0.23.11" + :commit "f7cf7348737d8cff1b13407a0bfedce02ee7b046" + :source-dir "php/src") + (phpdoc :url "https://github.com/claytonrcarter/tree-sitter-phpdoc" + :commit "03bb10330704b0b371b044e937d5cc7cd40b4999") + html css ; requires :lang (web +tree-sitter) + javascript jsdoc)) ; requires :lang (javascript +tree-sitter) :config (+php-common-config 'php-ts-mode)) diff --git a/modules/lang/php/doctor.el b/modules/lang/php/doctor.el index 426927e54..e72e73fcc 100644 --- a/modules/lang/php/doctor.el +++ b/modules/lang/php/doctor.el @@ -5,13 +5,15 @@ (modulep! :tools lsp)) "This module requires (:tools lsp)") -(assert! (or (not (modulep! +tree-sitter)) - (modulep! :tools tree-sitter)) - "This module requires (:tools tree-sitter)") - -(assert! (or (not (modulep! +tree-sitter)) - (fboundp 'php-ts-mode)) - "Can't find `php-ts-mode'; Emacs 30.1+ is required") +(when (modulep! +tree-sitter) + (assert! (modulep! :tools tree-sitter) + "This module requires (:tools tree-sitter)") + (assert! (fboundp 'php-ts-mode) + "Can't find `php-ts-mode'; Emacs 30.1+ is required") + (unless (modulep! :lang javascript +tree-sitter) + (error! "(:lang (javascript +tree-sitter)) required, but not enabled")) + (unless (modulep! :lang web +tree-sitter) + (error! "(:lang (web +tree-sitter)) required, but not enabled"))) (unless (executable-find "php") (warn! "Couldn't find php in your PATH")) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 44360d038..09956a8c8 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -20,7 +20,9 @@ python-indent-guess-indent-offset-verbose nil) (when (modulep! +tree-sitter) - (set-tree-sitter! 'python-mode 'python-ts-mode 'python)) + (set-tree-sitter! 'python-mode 'python-ts-mode + '((python :url "https://github.com/tree-sitter/tree-sitter-python" + :commit "bffb65a8cfe4e46290331dfef0dbf0ef3679de11")))) :config ;; HACK: `python-base-mode' (and `python-ts-mode') don't exist on pre-29 diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0ef6d3e66..f68d5d95e 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -36,12 +36,13 @@ "{" #'ruby-toggle-block)) -(use-package! ruby-ts-mode +(use-package! ruby-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'ruby-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'ruby-mode 'ruby-ts-mode 'ruby) + (set-tree-sitter! 'ruby-mode 'ruby-ts-mode + '((ruby :url "https://github.com/tree-sitter/tree-sitter-ruby" + :commit "71bd32fb7607035768799732addba884a37a6210"))) :config (set-electric! 'ruby-ts-mode :words '("else" "end" "elsif")) (set-repl-handler! 'ruby-ts-mode #'inf-ruby) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 283e5744e..36f1774b6 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -33,12 +33,16 @@ (require 'rustic-mode nil t))) -(use-package! rust-ts-mode +(use-package! rust-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'rust-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'rust-mode 'rust-ts-mode 'rust) + (set-tree-sitter! 'rust-mode 'rust-ts-mode + `((rust :url "https://github.com/tree-sitter/tree-sitter-rust" + :commit ,(if (and (treesit-available-p) + (< (treesit-library-abi-version) 15)) + "1f63b33efee17e833e0ea29266dd3d713e27e321" + "18b0515fca567f5a10aee9978c6d2640e878671a")))) (add-to-list 'major-mode-remap-defaults '(rust-mode . rust-ts-mode) t)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index afb4400a7..bb96cd966 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -74,9 +74,11 @@ If set to `nil', disable all the above behaviors.") :append #'lsp!)) -(use-package! css-ts-mode +(use-package! css-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'css-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'css-mode 'css-ts-mode 'css)) + (set-tree-sitter! 'css-mode 'css-ts-mode + '((css :url "https://github.com/tree-sitter/tree-sitter-css" + :rev "v0.23.0" + :commit "6a442a3cf461b0ce275339e5afa178693484c927")))) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 00417a42d..69f63a42a 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -168,17 +168,18 @@ :append #'lsp!)) -(use-package! html-ts-mode +(use-package! html-ts-mode ; 30.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'html-ts-mode) ; 30.1+ only :defer t :init - (set-tree-sitter! 'html-mode 'html-ts-mode 'html)) + (set-tree-sitter! 'html-mode 'html-ts-mode + '((html :url "https://github.com/tree-sitter/tree-sitter-html" + :rev "v0.23.0" + :commit "6a442a3cf461b0ce275339e5afa178693484c927")))) -(use-package! mhtml-ts-mode +(use-package! mhtml-ts-mode ; 31+ only :when (modulep! +tree-sitter) - :when (fboundp 'mhtml-ts-mode) ; 31+ only :defer t :init (set-tree-sitter! 'mhtml-mode 'mhtml-ts-mode 'html)) diff --git a/modules/lang/yaml/config.el b/modules/lang/yaml/config.el index 9f139313a..f6e795a68 100644 --- a/modules/lang/yaml/config.el +++ b/modules/lang/yaml/config.el @@ -8,11 +8,13 @@ (setq-hook! 'yaml-mode-hook tab-width yaml-indent-offset)) -(use-package! yaml-ts-mode +(use-package! yaml-ts-mode ; 29.1+ only :when (modulep! +tree-sitter) - :when (fboundp 'yaml-ts-mode) ; 29.1+ only + :defer t :init - (set-tree-sitter! 'yaml-mode 'yaml-ts-mode 'yaml) + (set-tree-sitter! 'yaml-mode 'yaml-ts-mode + '((yaml :url "https://github.com/tree-sitter-grammars/tree-sitter-yaml" + :commit "b733d3f5f5005890f324333dd57e1f0badec5c87"))) :config (when (modulep! +lsp) (add-hook 'yaml-ts-mode-local-vars-hook #'lsp! 'append))) diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index 6029a6c3c..b6f67b847 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -10,7 +10,8 @@ (use-package! dockerfile-ts-mode :when (modulep! +tree-sitter) - :when (fboundp 'dockerfile-ts-mode) ; 29.1+ only :defer t :init - (set-tree-sitter! 'dockerfile-mode 'dockerfile-ts-mode 'dockerfile)) + (set-tree-sitter! 'dockerfile-mode 'dockerfile-ts-mode + '((dockerfile :url "https://github.com/camdencheek/tree-sitter-dockerfile" + :commit "087daa20438a6cc01fa5e6fe6906d77c869d19fe")))) diff --git a/modules/tools/tree-sitter/config.el b/modules/tools/tree-sitter/config.el index 486f9db06..09845c365 100644 --- a/modules/tools/tree-sitter/config.el +++ b/modules/tools/tree-sitter/config.el @@ -45,7 +45,7 @@ (if-let* ((ts (get mode '+tree-sitter)) (fallback-mode (car ts))) (cond ((not (fboundp mode)) - (message "Couldn't find %S, falling back to %S" mode fallback-mode) + (message "Couldn't find `%S', falling back to `%S'" mode fallback-mode) fallback-mode) ((and (or (eq treesit-enabled-modes t) (memq fallback-mode treesit-enabled-modes))