mirror of
https://github.com/jimeh/.emacs.d.git
synced 2026-02-19 13:46:41 +00:00
feat(treesit): install grammars to custom directory
This commit is contained in:
@@ -11,84 +11,103 @@
|
||||
(error nil)) ; Do nothing if treesit is not available.
|
||||
|
||||
(when (fboundp 'treesit-ready-p)
|
||||
(setopt treesit-font-lock-level 4)
|
||||
(defgroup siren-treesit nil
|
||||
"Siren specific options for treesit."
|
||||
:group 'treesit)
|
||||
|
||||
(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 t))
|
||||
(treesit-install-language-grammar ',lang))))))
|
||||
(defcustom siren-treesit-grammar-dir (siren-cache-dir "treesit-grammars")
|
||||
"Directory where treesit grammars are stored."
|
||||
:type 'directory
|
||||
:group 'siren-tree-sitter
|
||||
:set (lambda (symbol value)
|
||||
(set-default symbol value)
|
||||
(setq treesit-extra-load-path `(,value))))
|
||||
|
||||
(defun siren-treesit-add-features (&rest features)
|
||||
"Add font-lock features to treesit."
|
||||
(add-to-list 'treesit-font-lock-feature-list features) t)
|
||||
(use-package treesit
|
||||
:straight (:type built-in)
|
||||
|
||||
(defun siren-treesit-prepend-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(append (apply 'treesit-font-lock-rules query-specs)
|
||||
treesit-font-lock-settings)))
|
||||
:custom
|
||||
(treesit-font-lock-level 4)
|
||||
|
||||
(defun siren-treesit-append-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(append treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
:preface
|
||||
(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 t))
|
||||
(treesit-install-language-grammar
|
||||
',lang
|
||||
siren-treesit-grammar-dir))))))
|
||||
|
||||
(defun siren-treesit-add-font-lock-settings (&rest query-specs)
|
||||
"Add features after existing ones in font-lock settings."
|
||||
(dolist (item (apply 'treesit-font-lock-rules query-specs))
|
||||
(let* ((feature (nth 2 item))
|
||||
(existing (cl-find-if (lambda (x) (eq (nth 2 x) feature))
|
||||
(reverse treesit-font-lock-settings))))
|
||||
(if existing
|
||||
(siren-add-after treesit-font-lock-settings existing item)
|
||||
(add-to-list 'treesit-font-lock-settings item t)))))
|
||||
(defun siren-treesit-add-features (&rest features)
|
||||
"Add font-lock features to treesit."
|
||||
(add-to-list 'treesit-font-lock-feature-list features) t)
|
||||
|
||||
(defun siren-treesit-replace-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(siren-treesit--replace-font-lock-settings
|
||||
treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
(defun siren-treesit-prepend-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(append (apply 'treesit-font-lock-rules query-specs)
|
||||
treesit-font-lock-settings)))
|
||||
|
||||
(defun siren-treesit-replace-or-add-font-lock-settings (&rest query-specs)
|
||||
"Set font-lock settings for treesit, merging with existing settings."
|
||||
(setq-local treesit-font-lock-settings
|
||||
(siren-treesit--merge-font-lock-settings
|
||||
treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
(defun siren-treesit-append-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(append treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
|
||||
(defun siren-treesit-get-font-lock-rule (feature)
|
||||
"Get the current treesit font-lock settings."
|
||||
(cl-find-if (lambda (x) (eq (siren-treesit--feature x) feature))
|
||||
treesit-font-lock-settings))
|
||||
|
||||
(defun siren-treesit--feature (compiled-query)
|
||||
"Get the feature from a compiled treesit query."
|
||||
(nth 2 compiled-query))
|
||||
|
||||
(defun siren-treesit--replace-font-lock-settings (a b)
|
||||
"Replace treesit font-lock settings A with B based on feature."
|
||||
(let ((merged (copy-tree a)))
|
||||
(dolist (replacement b)
|
||||
(let* ((feature (siren-treesit--feature replacement))
|
||||
(existing (cl-find-if
|
||||
(lambda (x) (eq (siren-treesit--feature x) feature))
|
||||
merged)))
|
||||
(defun siren-treesit-add-font-lock-settings (&rest query-specs)
|
||||
"Add features after existing ones in font-lock settings."
|
||||
(dolist (item (apply 'treesit-font-lock-rules query-specs))
|
||||
(let* ((feature (nth 2 item))
|
||||
(existing (cl-find-if (lambda (x) (eq (nth 2 x) feature))
|
||||
(reverse treesit-font-lock-settings))))
|
||||
(if existing
|
||||
(setf (car (member existing merged)) replacement)
|
||||
)))
|
||||
merged))
|
||||
(siren-add-after treesit-font-lock-settings existing item)
|
||||
(add-to-list 'treesit-font-lock-settings item t)))))
|
||||
|
||||
(defun siren-treesit--merge-font-lock-settings (a b)
|
||||
"Merge two treesit font-lock settings A and B into a new list.
|
||||
(defun siren-treesit-replace-font-lock-settings (&rest query-specs)
|
||||
"Replace existing features in font-lock settings, retaining feature order."
|
||||
(setq-local
|
||||
treesit-font-lock-settings
|
||||
(siren-treesit--replace-font-lock-settings
|
||||
treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
|
||||
(defun siren-treesit-replace-or-add-font-lock-settings (&rest query-specs)
|
||||
"Set font-lock settings for treesit, merging with existing settings."
|
||||
(setq-local treesit-font-lock-settings
|
||||
(siren-treesit--merge-font-lock-settings
|
||||
treesit-font-lock-settings
|
||||
(apply 'treesit-font-lock-rules query-specs))))
|
||||
|
||||
(defun siren-treesit-get-font-lock-rule (feature)
|
||||
"Get the current treesit font-lock settings."
|
||||
(cl-find-if (lambda (x) (eq (siren-treesit--feature x) feature))
|
||||
treesit-font-lock-settings))
|
||||
|
||||
(defun siren-treesit--feature (compiled-query)
|
||||
"Get the feature from a compiled treesit query."
|
||||
(nth 2 compiled-query))
|
||||
|
||||
(defun siren-treesit--replace-font-lock-settings (a b)
|
||||
"Replace treesit font-lock settings A with B based on feature."
|
||||
(let ((merged (copy-tree a)))
|
||||
(dolist (replacement b)
|
||||
(let* ((feature (siren-treesit--feature replacement))
|
||||
(existing (cl-find-if
|
||||
(lambda (x) (eq (siren-treesit--feature x) feature))
|
||||
merged)))
|
||||
(if existing
|
||||
(setf (car (member existing merged)) replacement)
|
||||
)))
|
||||
merged))
|
||||
|
||||
(defun siren-treesit--merge-font-lock-settings (a b)
|
||||
"Merge two treesit font-lock settings A and B into a new list.
|
||||
|
||||
This function merges the two treesit font-lock settings lists, returning
|
||||
a new list.
|
||||
@@ -96,16 +115,16 @@ a new list.
|
||||
Features from B will replace features in A if they are present in both.
|
||||
Features only present in A will be kept, and features only present in B
|
||||
will be appended."
|
||||
(let ((merged (copy-tree a)))
|
||||
(dolist (item-b b)
|
||||
(let* ((key (siren-treesit--feature item-b))
|
||||
(existing (cl-find-if
|
||||
(lambda (item) (eq (siren-treesit--feature item) key))
|
||||
merged)))
|
||||
(if existing
|
||||
(setf (car (member existing merged)) item-b)
|
||||
(setq merged (append merged (list item-b))))))
|
||||
merged))
|
||||
(let ((merged (copy-tree a)))
|
||||
(dolist (item-b b)
|
||||
(let* ((key (siren-treesit--feature item-b))
|
||||
(existing (cl-find-if
|
||||
(lambda (item) (eq (siren-treesit--feature item) key))
|
||||
merged)))
|
||||
(if existing
|
||||
(setf (car (member existing merged)) item-b)
|
||||
(setq merged (append merged (list item-b))))))
|
||||
merged)))
|
||||
|
||||
(use-package treesit-auto
|
||||
:demand t
|
||||
@@ -118,14 +137,15 @@ will be appended."
|
||||
"Ensure treesit GRAMMAR is installed and ready for use."
|
||||
(when (and (fboundp 'treesit-ready-p)
|
||||
(not (treesit-ready-p grammar t)))
|
||||
(siren-treesit-install-grammar grammar)))
|
||||
(siren-treesit-auto-install-grammar grammar)))
|
||||
|
||||
(defun siren-treesit-install-grammar (grammar)
|
||||
(defun siren-treesit-auto-install-grammar (grammar)
|
||||
"Install treesit GRAMMAR."
|
||||
(when (fboundp 'treesit-ready-p)
|
||||
(let ((treesit-language-source-alist
|
||||
(treesit-auto--build-treesit-source-alist)))
|
||||
(treesit-install-language-grammar grammar))))
|
||||
(treesit-install-language-grammar grammar
|
||||
siren-treesit-grammar-dir))))
|
||||
|
||||
(defvar siren-treesit-auto--source-alist-populated-p 'nil
|
||||
"Internal flag to track if `treesit-auto--build-treesit-source-alist'
|
||||
|
||||
Reference in New Issue
Block a user