From 1ce4deeb09d62769b9957c53ef28eafd38d3abb0 Mon Sep 17 00:00:00 2001 From: Timo Wilken Date: Fri, 13 Oct 2023 17:23:29 +0200 Subject: Initial tree-sitter support in Emacs --- tw/home/files/emacs-init.el | 66 ++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 25 deletions(-) (limited to 'tw/home/files/emacs-init.el') diff --git a/tw/home/files/emacs-init.el b/tw/home/files/emacs-init.el index 03255351..de38e7a8 100644 --- a/tw/home/files/emacs-init.el +++ b/tw/home/files/emacs-init.el @@ -81,8 +81,8 @@ If CREATE is true and the resulting directory does not exist, create it." ;; Custom modes depending on file names. (mapc (apply-partially #'add-to-list 'auto-mode-alist) - `((,(rx (or bos "/") "PKGBUILD" eos) . sh-mode) - (,(rx ".install" eos) . sh-mode) + `((,(rx (or bos "/") "PKGBUILD" eos) . bash-ts-mode) + (,(rx ".install" eos) . bash-ts-mode) (,(rx (or bos "/") "COMMIT_EDITMSG" eos) . diff-mode) ; useful for `git commit -v' (,(rx bos "/tmp/neomutt-") . mail-mode) (,(rx ".eml" eos) . mail-mode) @@ -316,7 +316,7 @@ If CREATE is true and the resulting directory does not exist, create it." (use-package eglot ;; I have clang (for clangd) and python-lsp-server installed. ;; `:hook' adds `-mode' to the package name, but `eglot-mode' doesn't exist. - :hook ((python-mode c-mode c++-mode) . eglot-ensure) + :hook ((python-mode python-ts-mode c-mode c++-mode c-or-c++-ts-mode) . eglot-ensure) :commands (eglot) :custom (eglot-autoshutdown t "Shut down language servers after deleting their last associated buffer.") @@ -325,23 +325,33 @@ If CREATE is true and the resulting directory does not exist, create it." ;; TODO: only run `tw/help-is-eldoc' if `eglot-managed-p' is true. (add-hook 'eglot-managed-mode-hook #'tw/help-is-eldoc)) -;; Non-LSP language modes. - +;; Tree-sitter ;; TODO: Try any/all of the following new tree-sitter-based major modes. ;; Enable them using the following, replacing the relevant "old" major mode: ;; (add-to-list 'major-mode-remap-alist '(ruby-mode . ruby-ts-mode)) -;; New command 'c-or-c++-ts-mode'. -;; New major mode 'python-ts-mode'. ;; New major mode 'css-ts-mode'. ;; New major mode 'json-ts-mode'. -;; New major mode 'bash-ts-mode'. ;; New major mode 'dockerfile-ts-mode'. -;; New major mode 'cmake-ts-mode'. -;; New major mode 'toml-ts-mode'. -;; New major mode 'yaml-ts-mode'. ;; New major mode 'ruby-ts-mode'. -(use-package cmake-mode +(mapc (lambda (dir) + (add-to-list 'treesit-extra-load-path (file-name-as-directory (expand-file-name dir)))) + '("/run/current-system/profile/lib/tree-sitter" + "~/.guix-home/profile/lib/tree-sitter" + "~/.guix-profile/lib/tree-sitter")) + +(use-package treesit + :custom + (treesit-font-lock-level 4 "Enable Angry Fruit Salad mode.")) + +(use-package c-ts-mode + :init + (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode)) + (add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode)) + (add-to-list 'major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode))) + +;; Non-LSP language modes. +(use-package cmake-ts-mode :mode (rx (or (: (or bos "/") "CMakeLists.txt") ".cmake") eos)) (use-package gnuplot @@ -368,23 +378,29 @@ If CREATE is true and the resulting directory does not exist, create it." (use-package python :after (flymake-collection) - :commands (python-mode) - :mode (((rx ".py" (? (or ?\i ?\w)) eos) . python-mode) - ((rx ".aurora" eos) . python-mode)) - ;; :flymake-hook would be better, but it fails with error: (void-variable - ;; for). Somehow `cl-loop' is getting parsed wrong... - ;; https://github.com/mohkale/flymake-collection#associating-checkers-with-major-modes - :init (add-to-list 'flymake-collection-config - '(python-mode - flymake-collection-flake8 - flymake-collection-mypy - (flymake-collection-pycodestyle :disabled t) - flymake-collection-pylint))) + :commands (python-mode python-ts-mode) + :mode (((rx ".py" (? (or ?\i ?\w)) eos) . python-ts-mode) + ((rx ".aurora" eos) . python-ts-mode)) + :flymake-hook + (python-ts-mode + flymake-collection-flake8 + flymake-collection-mypy + (flymake-collection-pycodestyle :disabled t) + flymake-collection-pylint) + (python-mode + flymake-collection-flake8 + flymake-collection-mypy + (flymake-collection-pycodestyle :disabled t) + flymake-collection-pylint)) (use-package rec-mode :mode (rx ".rec" eos)) (use-package sh-script ; built-in + ;; Use `bash-ts-mode' instead of `sh-mode' if possible. + ;; `bash-ts-mode' falls back to `sh-mode' if necessary. + ;; Manually configuring :mode etc would be annoying, since there are a lot of entries. + :config (add-to-list 'major-mode-remap-alist '(sh-mode . bash-ts-mode)) :custom (sh-basic-offset 2 "Use 2 spaces for `sh-mode' indents.")) (use-package tcl @@ -838,7 +854,7 @@ For use in `org-latex-classes'." ;; Lisp features (use-package aggressive-indent - :hook (scheme-mode emacs-lisp-mode common-lisp-mode sh-mode)) + :hook (scheme-mode emacs-lisp-mode common-lisp-mode sh-mode bash-ts-mode)) (use-package inf-lisp :custom -- cgit v1.2.3