summaryrefslogtreecommitdiff
path: root/tw/home/files/emacs-init.el
diff options
context:
space:
mode:
authorTimo Wilken2023-10-13 17:23:29 +0200
committerTimo Wilken2023-10-30 17:30:41 +0100
commit1ce4deeb09d62769b9957c53ef28eafd38d3abb0 (patch)
treea6d70449838768ed101f760fa4c5b5a5d3260a48 /tw/home/files/emacs-init.el
parentbfd732d421c07c7c5e3633e675632dc17a27fc4e (diff)
Initial tree-sitter support in Emacs
Diffstat (limited to 'tw/home/files/emacs-init.el')
-rw-r--r--tw/home/files/emacs-init.el66
1 files changed, 41 insertions, 25 deletions
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