From 2adbdf136061a42b189ba3523e04d1d03089d205 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jun 2025 15:16:26 +0200 Subject: [PATCH] feat(clojure): add treesit support --- modules/lang/clojure/README.org | 4 +++ modules/lang/clojure/config.el | 38 ++++++++++++++++++++++++++--- modules/lang/clojure/doctor.el | 4 +++ modules/lang/clojure/packages.el | 2 ++ modules/tools/tree-sitter/config.el | 1 - 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/modules/lang/clojure/README.org b/modules/lang/clojure/README.org index d9d98d2e8..98d230eb4 100644 --- a/modules/lang/clojure/README.org +++ b/modules/lang/clojure/README.org @@ -27,7 +27,11 @@ This module adds support for the Clojure(Script) language. ** Packages - [[doom-package:cider]] - [[doom-package:clj-refactor]] +- [[doom-package:clojure-mode]] +- [[doom-package:clojure-ts-mode]] if [[doom-module:+tree-sitter]] - [[doom-package:flycheck-clj-kondo]] if [[doom-module::checkers syntax]] +- [[doom-package:jet]] +- [[doom-package:neil]] ** Hacks - Error messages emitted from CIDER are piped into the REPL buffer when it is diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index a1ace2228..d3cd41387 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -46,17 +46,48 @@ (add-to-list 'tree-sitter-major-mode-language-alist '(clojurescript-mode . clojure))))) +(use-package! clojure-ts-mode + :when (modulep! +tree-sitter) + :defer t + :init + (setq clojure-ts-auto-remap nil) ; we do it ourselves + (set-tree-sitter! 'clojure-mode 'clojure-ts-mode + '((clojure :url "https://github.com/sogaiu/tree-sitter-clojure"))) + (set-tree-sitter! 'clojurec-mode 'clojure-ts-clojurec-mode 'clojure) + (set-tree-sitter! 'clojuredart-mode 'clojure-ts-clojuredart-mode 'clojure) + (set-tree-sitter! 'clojurescript-mode 'clojure-ts-clojurescript-mode 'javascript) + (set-tree-sitter! 'jank-mode 'clojure-ts-jank-mode 'cpp) + (set-tree-sitter! 'joker-mode 'clojure-ts-joker-mode 'clojure) + :config + ;; 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) + (cl-callf2 rassq-delete-all 'clojure-ts-jank-mode auto-mode-alist) + (cl-callf2 rassq-delete-all 'clojure-ts-joker-mode auto-mode-alist)) + + ;; `cider-mode' is used instead of the typical `cider' package due to the main ;; library being loaded only when is absolutely needed, which is too late for ;; reconfiguration in many cases. (use-package! cider-mode ;; NOTE if `org-directory' doesn't exist, `cider-jack' in won't work :hook (clojure-mode-local-vars . cider-mode) + :hook (clojure-ts-mode-local-vars . cider-mode) :init (after! clojure-mode - (set-repl-handler! '(clojure-mode clojurec-mode) #'+clojure/open-repl :persist t) - (set-repl-handler! 'clojurescript-mode #'+clojure/open-cljs-repl :persist t) - (set-eval-handler! '(clojure-mode clojurescript-mode clojurec-mode) #'cider-eval-region)) + (set-repl-handler! '(clojure-mode clojure-ts-mode + clojurec-mode clojure-ts-clojurec-mode) + #'+clojure/open-repl :persist t) + (set-repl-handler! '(clojurescript-mode clojure-ts-clojurescript-mode) + #'+clojure/open-cljs-repl :persist t) + (set-eval-handler! '(clojure-mode clojure-ts-mode + clojurescript-mode clojure-ts-clojurescript-mode + clojurec-mode clojure-ts-clojurec-mode) + #'cider-eval-region)) ;; HACK Fix radian-software/radian#446: CIDER tries to calculate the frame's ;; background too early; sometimes before the initial frame has been @@ -285,6 +316,7 @@ :when (or (modulep! -lsp) +clojure-load-clj-refactor-with-lsp) :hook (clojure-mode . clj-refactor-mode) + :hook (clojure-ts-mode . clj-refactor-mode) :config (set-lookup-handlers! 'clj-refactor-mode :references #'cljr-find-usages) diff --git a/modules/lang/clojure/doctor.el b/modules/lang/clojure/doctor.el index 22455011e..7238477ac 100644 --- a/modules/lang/clojure/doctor.el +++ b/modules/lang/clojure/doctor.el @@ -1,6 +1,10 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; lang/clojure/doctor.el +(assert! (or (not (modulep! +tree-sitter)) + (modulep! :tools tree-sitter)) + "This module requires (:tools tree-sitter)") + (when (and (modulep! :checkers syntax) (modulep! -lsp)) (unless (executable-find "clj-kondo") diff --git a/modules/lang/clojure/packages.el b/modules/lang/clojure/packages.el index 4291a46ca..a18287185 100644 --- a/modules/lang/clojure/packages.el +++ b/modules/lang/clojure/packages.el @@ -15,6 +15,8 @@ ;;; Core packages (package! clojure-mode :pin "b766094aea28bdc7b44ce1960d96434fe7d1d9cf") +(when (modulep! +tree-sitter) + (package! clojure-ts-mode :pin "da56a6938f525c8ead1fb3d79eced4d892df1661")) (package! clj-refactor :pin "dc1bbc8cdaa723bdbb6669ea7d280625c370755d") (package! cider :pin "12f10a6f4b3052a9b437f92cf97d551a5964f4cb") (when (modulep! :checkers syntax -flymake) diff --git a/modules/tools/tree-sitter/config.el b/modules/tools/tree-sitter/config.el index 5b990fee2..62788322b 100644 --- a/modules/tools/tree-sitter/config.el +++ b/modules/tools/tree-sitter/config.el @@ -36,7 +36,6 @@ (bibtex "https://github.com/latex-lsp/tree-sitter-bibtex" nil nil nil nil) (blueprint "https://github.com/huanie/tree-sitter-blueprint" nil nil nil nil) (c-sharp "https://github.com/tree-sitter/tree-sitter-c-sharp" nil nil nil nil) - (clojure "https://github.com/sogaiu/tree-sitter-clojure" nil nil nil nil) (commonlisp "https://github.com/tree-sitter-grammars/tree-sitter-commonlisp" nil nil nil nil) (css "https://github.com/tree-sitter/tree-sitter-css" nil nil nil nil) (html "https://github.com/tree-sitter/tree-sitter-html" nil nil nil nil)