mirror of
https://github.com/SqrtMinusOne/dotfiles.git
synced 2025-12-10 19:23:03 +03:00
97 lines
4.1 KiB
EmacsLisp
97 lines
4.1 KiB
EmacsLisp
;;; -*- lexical-binding: t -*-
|
|
(use-package treesit
|
|
:straight (:type built-in)
|
|
:if (featurep 'treesit)
|
|
:config
|
|
(setq treesit-language-source-alist
|
|
(mapcar
|
|
(lambda (item)
|
|
(let ((lang (nth 0 item))
|
|
(url (nth 1 item))
|
|
(rev (nth 2 item))
|
|
(source-dir (nth 3 item)))
|
|
`(,lang ,url ,rev ,source-dir
|
|
,(executable-find "gcc") ,(executable-find "c++"))))
|
|
'((bash "https://github.com/tree-sitter/tree-sitter-bash")
|
|
(cmake "https://github.com/uyha/tree-sitter-cmake")
|
|
(css "https://github.com/tree-sitter/tree-sitter-css")
|
|
(elisp "https://github.com/Wilfred/tree-sitter-elisp")
|
|
(go "https://github.com/tree-sitter/tree-sitter-go")
|
|
(html "https://github.com/tree-sitter/tree-sitter-html")
|
|
(javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src")
|
|
(json "https://github.com/tree-sitter/tree-sitter-json")
|
|
(make "https://github.com/alemuller/tree-sitter-make")
|
|
(markdown "https://github.com/ikatyang/tree-sitter-markdown")
|
|
(python "https://github.com/tree-sitter/tree-sitter-python")
|
|
(toml "https://github.com/tree-sitter/tree-sitter-toml")
|
|
(tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src")
|
|
(typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src")
|
|
(yaml "https://github.com/ikatyang/tree-sitter-yaml"))))
|
|
(setq treesit-font-lock-level 4)
|
|
(setq major-mode-remap-alist
|
|
'((typescript-mode . typescript-ts-mode)
|
|
(js-mode . javascript-ts-mode)
|
|
(python-mode . python-ts-mode)
|
|
(json-mode . json-ts-mode)))
|
|
(cl-loop for (old-mode . new-mode) in major-mode-remap-alist
|
|
do (my/set-smartparens-indent new-mode)
|
|
do (set (intern (concat (symbol-name new-mode) "-hook"))
|
|
(list
|
|
(eval `(lambda ()
|
|
(run-hooks
|
|
',(intern (concat (symbol-name old-mode) "-hook")))))))))
|
|
|
|
(use-package treesit-fold
|
|
:straight (treesit-fold :type git :host github :repo "emacs-tree-sitter/treesit-fold")
|
|
:commands (treesit-fold-mode))
|
|
|
|
(defun my/treesit-fold--get-nodes-to-fold ()
|
|
(when-let*
|
|
((node (ignore-errors (treesit-buffer-root-node)))
|
|
(patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) @name))
|
|
(alist-get major-mode treesit-fold-range-alist)))
|
|
(query (ignore-errors
|
|
(treesit-query-compile (treesit-node-language node)
|
|
patterns)))
|
|
(nodes-to-fold (treesit-query-capture node query))
|
|
(mode-ranges (alist-get major-mode treesit-fold-range-alist))
|
|
(nodes-to-fold
|
|
(cl-remove-if (lambda (node)
|
|
(treesit-fold--non-foldable-node-p (cdr node) mode-ranges))
|
|
nodes-to-fold)))
|
|
nodes-to-fold))
|
|
|
|
(defun my/treesit-fold-hide-children ()
|
|
(interactive)
|
|
(let* ((current-node (treesit-fold--foldable-node-at-pos))
|
|
(all-nodes-to-fold (my/treesit-fold--get-nodes-to-fold))
|
|
;; Find foldable children of `current-node'
|
|
(target-nodes-to-fold
|
|
(seq-filter
|
|
(lambda (n)
|
|
(cl-block tree-iter
|
|
(while n
|
|
(setq n (treesit-node-parent n))
|
|
(when (equal n current-node)
|
|
(cl-return-from tree-iter t)))))
|
|
(mapcar #'cdr all-nodes-to-fold))))
|
|
(dolist (node target-nodes-to-fold)
|
|
(treesit-fold-close node))))
|
|
|
|
(defun my/evil-fold-hide-level ()
|
|
(interactive)
|
|
(cond
|
|
(hs-minor-mode (hs-hide-level))
|
|
(treesit-fold-mode (my/treesit-fold-hide-children))))
|
|
|
|
(with-eval-after-load 'treesit-fold
|
|
(general-define-key
|
|
:states '(normal)
|
|
"ze" #'my/evil-fold-hide-level)
|
|
(keymap-unset evil-motion-state-map "z e" t))
|
|
|
|
(use-package combobulate
|
|
:straight (:host github :repo "mickeynp/combobulate")
|
|
:commands (combobulate))
|
|
|
|
(provide 'sqrt-tree-sitter)
|