merge: branch 'feature/treesit'

Fix: #7742
Fix: #7623
Fix: #7593
This commit is contained in:
Henrik Lissner
2025-08-31 14:55:37 +02:00
120 changed files with 1513 additions and 1069 deletions

View File

@@ -109,23 +109,6 @@ and return the value found in PLACE instead."
(unless (fboundp 'pos-bol) (defalias 'pos-bol #'line-beginning-position)) (unless (fboundp 'pos-bol) (defalias 'pos-bol #'line-beginning-position))
(unless (fboundp 'pos-eol) (defalias 'pos-eol #'line-end-position)) (unless (fboundp 'pos-eol) (defalias 'pos-eol #'line-end-position))
;; Introduced in 29.1
(unless (boundp 'major-mode-remap-alist)
(defvar major-mode-remap-alist nil)
(defvar-local set-auto-mode--last nil)
(define-advice set-auto-mode-0 (:override (mode &optional keep-mode-if-same) backport-major-mode-remap)
(unless (and keep-mode-if-same
(or (eq (indirect-function mode)
(indirect-function major-mode))
(and set-auto-mode--last
(eq mode (car set-auto-mode--last))
(eq major-mode (cdr set-auto-mode--last)))))
(when mode
(funcall (major-mode-remap mode))
(unless (eq mode major-mode)
(setq set-auto-mode--last (cons mode major-mode)))
mode))))
;; Introduced in 29.1 ;; Introduced in 29.1
(unless (boundp 'enable-theme-functions) (unless (boundp 'enable-theme-functions)
(defcustom enable-theme-functions nil (defcustom enable-theme-functions nil
@@ -153,12 +136,26 @@ The functions in the hook are called with one parameter -- the
;;; From Emacs >= 30 ;;; From Emacs >= 30
;; Introduced in 30.1 ;; Introduced in 30.1
(unless (fboundp 'major-mode-remap) (unless (fboundp 'major-mode-remap)
(defvar major-mode-remap-alist nil) ; introduced in 29.1
(defvar major-mode-remap-defaults nil) (defvar major-mode-remap-defaults nil)
(defun major-mode-remap (mode) (defun major-mode-remap (mode)
"Return the function to use to enable MODE." "Return the function to use to enable MODE."
(or (cdr (or (assq mode major-mode-remap-alist) (or (cdr (or (assq mode major-mode-remap-alist)
(assq mode major-mode-remap-defaults))) (assq mode major-mode-remap-defaults)))
mode))) mode))
(defvar-local set-auto-mode--last nil)
(define-advice set-auto-mode-0 (:override (mode &optional keep-mode-if-same) backport-major-mode-remap)
(unless (and keep-mode-if-same
(or (eq (indirect-function mode)
(indirect-function major-mode))
(and set-auto-mode--last
(eq mode (car set-auto-mode--last))
(eq major-mode (cdr set-auto-mode--last)))))
(when mode
(funcall (major-mode-remap mode))
(unless (eq mode major-mode)
(setq set-auto-mode--last (cons mode major-mode)))
mode))))
;; Introduced in 30.1 ;; Introduced in 30.1
(unless (boundp 'safe-local-variable-directories) (unless (boundp 'safe-local-variable-directories)

View File

@@ -41,10 +41,11 @@ Return non-nil if successful in doing so."
(end-of-line) (end-of-line)
(+fold--hideshow-fold-p))))))) (+fold--hideshow-fold-p)))))))
;; NOTE: does this need more? (defun +fold--treesit-fold-p ()
(defun +fold--ts-fold-p () (and (treesit-available-p)
(and (bound-and-true-p tree-sitter-mode) (treesit-parser-list)
(featurep 'ts-fold))) (require 'treesit-fold nil t)
(treesit-fold-usable-mode-p)))
(defun +fold--invisible-points (count) (defun +fold--invisible-points (count)
(let (points) (let (points)
@@ -102,18 +103,17 @@ Return non-nil if successful in doing so."
ov (hs-overlay-at start))) ov (hs-overlay-at start)))
(when ov (when ov
(list (cons (overlay-start ov) (overlay-end ov)))))) (list (cons (overlay-start ov) (overlay-end ov))))))
(when (+fold--ts-fold-p) (when (+fold--treesit-fold-p)
(when-let* ((node (ts-fold--foldable-node-at-pos)) (when-let* ((node (treesit-fold--foldable-node-at-pos))
(beg (tsc-node-start-position node)) (beg (treesit-node-start node))
(end (tsc-node-end-position node))) (end (treesit-node-end node)))
(list (cons beg end))))))) (list (cons beg end)))))))
(defun +fold--open-rec-between (beg end) (defun +fold--open-rec-between (beg end)
"Recursively open all folds betwen BEG and END." "Recursively open all folds betwen BEG and END."
(when (featurep 'vimish-fold) (when (featurep 'vimish-fold)
;; from `vimish-fold-unfold-all' ;; from `vimish-fold-unfold-all'
(mapc #'vimish-fold--unfold (mapc #'vimish-fold--unfold (vimish-fold--folds-in beg end)))
(vimish-fold--folds-in beg end)))
(and (+fold--outline-fold-p) (and (+fold--outline-fold-p)
(outline-show-subtree)) (outline-show-subtree))
(hs-life-goes-on (hs-life-goes-on
@@ -121,13 +121,13 @@ Return non-nil if successful in doing so."
(let ((hs-allow-nesting nil)) (let ((hs-allow-nesting nil))
(hs-discard-overlays beg end)) (hs-discard-overlays beg end))
(run-hooks 'hs-show-hook)) (run-hooks 'hs-show-hook))
(when (bound-and-true-p ts-fold-mode) (when (+fold--treesit-fold-p)
;; from `ts-fold-open-all' (treesit-fold--ensure-ts
(ts-fold--ensure-ts ;; from `ts-fold-open-all'
(thread-last (overlays-in beg end) (thread-last (overlays-in beg end)
(seq-filter (seq-filter
(lambda (ov) (lambda (ov)
(eq (overlay-get ov 'invisible) 'ts-fold))) (eq (overlay-get ov 'invisible) 'treesit-fold)))
(mapc #'delete-overlay))))) (mapc #'delete-overlay)))))
;; ;;
@@ -146,7 +146,7 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds."
(symbol-function #'outline-hide-entry))) (symbol-function #'outline-hide-entry)))
(outline-toggle-children))) (outline-toggle-children)))
((+fold--hideshow-fold-p) (+fold-from-eol (hs-toggle-hiding))) ((+fold--hideshow-fold-p) (+fold-from-eol (hs-toggle-hiding)))
((+fold--ts-fold-p) (ts-fold-toggle))))) ((+fold--treesit-fold-p) (treesit-fold-toggle)))))
;;;###autoload ;;;###autoload
(defun +fold/open-rec () (defun +fold/open-rec ()
@@ -169,7 +169,7 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds."
(outline-show-branches) (outline-show-branches)
(outline-show-entry)) (outline-show-entry))
((+fold--hideshow-fold-p) (+fold-from-eol (hs-show-block))) ((+fold--hideshow-fold-p) (+fold-from-eol (hs-show-block)))
((+fold--ts-fold-p) (ts-fold-open))))) ((+fold--treesit-fold-p) (treesit-fold-open)))))
;;;###autoload ;;;###autoload
(defun +fold/close () (defun +fold/close ()
@@ -181,15 +181,15 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds."
(cond ((+fold--vimish-fold-p) (vimish-fold-refold)) (cond ((+fold--vimish-fold-p) (vimish-fold-refold))
((+fold--outline-fold-p) (outline-hide-subtree)) ((+fold--outline-fold-p) (outline-hide-subtree))
((+fold--hideshow-fold-p) (+fold-from-eol (hs-hide-block))) ((+fold--hideshow-fold-p) (+fold-from-eol (hs-hide-block)))
((+fold--ts-fold-p) (ts-fold-close))))) ((+fold--treesit-fold-p) (treesit-fold-close)))))
;;;###autoload ;;;###autoload
(defun +fold/open-all (&optional level) (defun +fold/open-all (&optional level)
"Open folds at LEVEL (or all folds if LEVEL is nil)." "Open folds at LEVEL (or all folds if LEVEL is nil)."
(interactive (interactive
(list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg))))
(cond ((+fold--ts-fold-p) (cond ((+fold--treesit-fold-p)
(ts-fold-open-all)) (treesit-fold-open-all))
((and (featurep 'vimish-fold) (+fold--vimish-fold-p)) ((and (featurep 'vimish-fold) (+fold--vimish-fold-p))
(vimish-fold-unfold-all)) (vimish-fold-unfold-all))
((save-excursion ((save-excursion
@@ -209,20 +209,19 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds."
(interactive (interactive
(list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg))))
(save-excursion (save-excursion
(if (+fold--ts-fold-p) (if (+fold--treesit-fold-p)
(ts-fold-close-all) (treesit-fold-close-all)
(progn (when (featurep 'vimish-fold)
(when (featurep 'vimish-fold) (vimish-fold-refold-all))
(vimish-fold-refold-all)) (when (+fold--ensure-hideshow-mode)
(when (+fold--ensure-hideshow-mode) (hs-life-goes-on
(hs-life-goes-on (if (integerp level)
(if (integerp level) (hs-hide-level-recursive level (point-min) (point-max))
(hs-hide-level-recursive level (point-min) (point-max)) (hs-hide-all))))
(hs-hide-all)))) (if (integerp level)
(if (integerp level) (outline--show-headings-up-to-level level)
(outline--show-headings-up-to-level level) (when (fboundp 'outline-hide-sublevels)
(when (fboundp 'outline-hide-sublevels) (outline-show-only-headings))))))
(outline-show-only-headings)))))))
;;;###autoload ;;;###autoload
(defun +fold/next (count) (defun +fold/next (count)
@@ -260,8 +259,9 @@ region."
(outline-end-of-heading)))) (outline-end-of-heading))))
(point))) (point)))
(lambda () (lambda ()
;; ts-fold does not define movement functions so we need to do it ourselves ;; {ts,treesit}-fold does not define movement functions so
(when (+fold--ts-fold-p) ;; we need to do it ourselves
(when (+fold--treesit-fold-p)
(let* ((arg-list (if (> count 0) ;; depending on direction we need to change the ranges (let* ((arg-list (if (> count 0) ;; depending on direction we need to change the ranges
(list (point) (point-max)) (list (point) (point-max))
(list (point-min) (point)))) (list (point-min) (point))))
@@ -270,9 +270,11 @@ region."
#'>)) #'>))
(ovs (cl-remove-if-not (ovs (cl-remove-if-not
(lambda (ov) (lambda (ov)
(eq (overlay-get ov 'creator) 'ts-fold)) (eq (overlay-get ov 'creator) 'treesit-fold))
;; `overlays-in' does not provide a list that is sorted ;; `overlays-in' does not provide a list
;; (in the way we need it atleast) so we need to sort it based on direction ;; that is sorted (in the way we need it
;; atleast) so we need to sort it based on
;; direction
(cl-sort (apply #'overlays-in arg-list) comp-fun :key #'overlay-start)))) (cl-sort (apply #'overlays-in arg-list) comp-fun :key #'overlay-start))))
(if (and ovs (<= (abs count) (length ovs))) (if (and ovs (<= (abs count) (length ovs)))
(goto-char (overlay-start (nth (- (abs count) 1) ovs)))))))) (goto-char (overlay-start (nth (- (abs count) 1) ovs))))))))

View File

@@ -3,8 +3,7 @@
(defcustom +fold-ellipsis " [...] " (defcustom +fold-ellipsis " [...] "
"The ellipsis to show for ellided regions (folds). "The ellipsis to show for ellided regions (folds).
`org-ellipsis', `truncate-string-ellipsis', and `ts-fold-replacement' are set to `org-ellipsis' and `truncate-string-ellipsis' are set to this."
this."
:type 'string :type 'string
:group '+fold) :group '+fold)
@@ -106,9 +105,8 @@ this."
(vimish-fold-global-mode +1)) (vimish-fold-global-mode +1))
(use-package! ts-fold ;; Will be autoloaded by fold commands
:when (modulep! :tools tree-sitter) (use-package! treesit-fold
:after tree-sitter :when (modulep! :tools tree-sitter -compat)
:config :defer t
(setq ts-fold-replacement +fold-ellipsis) :config (global-treesit-fold-mode +1))
(global-ts-fold-mode +1))

View File

@@ -7,5 +7,4 @@
(when (modulep! :editor evil) (when (modulep! :editor evil)
(package! evil-vimish-fold :pin "b6e0e6b91b8cd047e80debef1a536d9d49eef31a")) (package! evil-vimish-fold :pin "b6e0e6b91b8cd047e80debef1a536d9d49eef31a"))
(when (modulep! :tools tree-sitter) (when (modulep! :tools tree-sitter)
(package! ts-fold :pin "af50e738ea249a36f5aeca123c29dae946944b1e" (package! treesit-fold :pin "6628b7cce585328e05d810b5505e4fdb9306f24f"))
:recipe (:host github :repo "emacs-tree-sitter/ts-fold")))

View File

@@ -11,11 +11,7 @@
(set-lookup-handlers! 'agda2-mode (set-lookup-handlers! 'agda2-mode
:definition #'agda2-goto-definition-keyboard) :definition #'agda2-goto-definition-keyboard)
(when (modulep! +tree-sitter) ;; TODO: agda2-ts-mode
(set-tree-sitter-lang! 'agda2-mode 'agda)
(add-hook! '(agda-mode-local-vars-hook
agda2-mode-local-vars-hook)
:append #'tree-sitter!))
(map! :map agda2-mode-map (map! :map agda2-mode-map
:localleader :localleader

View File

@@ -54,32 +54,34 @@ preceded by the opening brace or a comma (disregarding whitespace in between)."
This is meant to replace `c-or-c++-mode' (introduced in Emacs 26.1), which This is meant to replace `c-or-c++-mode' (introduced in Emacs 26.1), which
doesn't support specification of the fallback mode and whose heuristics are doesn't support specification of the fallback mode and whose heuristics are
simpler." simpler."
(let ((base (file-name-sans-extension (buffer-file-name (buffer-base-buffer))))) (funcall
(cond ((file-exists-p! (or (concat base ".cpp") (major-mode-remap
(concat base ".cc"))) (let ((base (file-name-sans-extension (buffer-file-name (buffer-base-buffer)))))
(c++-mode)) (cond ((file-exists-p! (or (concat base ".cpp")
((or (file-exists-p! (or (concat base ".m") (concat base ".cc")))
(concat base ".mm"))) 'c++-mode)
(+cc--re-search-for ((or (file-exists-p! (or (concat base ".m")
(concat "^[ \t\r]*\\(?:" (concat base ".mm")))
"@\\(?:class\\|interface\\|property\\|end\\)\\_>" (+cc--re-search-for
"\\|#import +<Foundation/Foundation.h>" (concat "^[ \t\r]*\\(?:"
"\\|[-+] ([a-zA-Z0-9_]+)" "@\\(?:class\\|interface\\|property\\|end\\)\\_>"
"\\|#import +<Foundation/Foundation.h>"
"\\|[-+] ([a-zA-Z0-9_]+)"
"\\)")))
'objc-mode)
((+cc--re-search-for
(let ((id "[a-zA-Z0-9_]+") (ws "[ \t\r]+") (ws-maybe "[ \t\r]*"))
(concat "^" ws-maybe "\\(?:"
"using" ws "\\(?:namespace" ws "std;\\|std::\\)"
"\\|" "namespace" "\\(?:" ws id "\\)?" ws-maybe "{"
"\\|" "class" ws id ws-maybe "[:{\n]"
"\\|" "template" ws-maybe "<.*>"
"\\|" "#include" ws-maybe "<\\(?:string\\|iostream\\|map\\)>"
"\\)"))) "\\)")))
(objc-mode)) 'c++-mode)
((+cc--re-search-for ((functionp +cc-default-header-file-mode)
(let ((id "[a-zA-Z0-9_]+") (ws "[ \t\r]+") (ws-maybe "[ \t\r]*")) +cc-default-header-file-mode)
(concat "^" ws-maybe "\\(?:" ('c-mode))))))
"using" ws "\\(?:namespace" ws "std;\\|std::\\)"
"\\|" "namespace" "\\(?:" ws id "\\)?" ws-maybe "{"
"\\|" "class" ws id ws-maybe "[:{\n]"
"\\|" "template" ws-maybe "<.*>"
"\\|" "#include" ws-maybe "<\\(?:string\\|iostream\\|map\\)>"
"\\)")))
(c++-mode))
((functionp +cc-default-header-file-mode)
(funcall +cc-default-header-file-mode))
((c-mode)))))
(defun +cc-resolve-include-paths () (defun +cc-resolve-include-paths ()
(cl-loop with path = (or buffer-file-name default-directory) (cl-loop with path = (or buffer-file-name default-directory)
@@ -137,15 +139,6 @@ the children of class at point."
;; ;;
;; Hooks ;; Hooks
;;;###autoload
(defun +cc-fontify-constants-h ()
"Better fontification for preprocessor constants"
(when (memq major-mode '(c-mode c++-mode))
(font-lock-add-keywords
nil '(("\\<[A-Z]*_[0-9A-Z_]+\\>" . font-lock-constant-face)
("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face))
t)))
(defvar +cc--project-includes-alist nil) (defvar +cc--project-includes-alist nil)
;;;###autoload ;;;###autoload
(defun +cc-init-ffap-integration-h () (defun +cc-init-ffap-integration-h ()

View File

@@ -25,16 +25,24 @@ This is ignored by ccls.")
;; set up before lsp is initialized. Also, we use local-vars hooks to ensure ;; set up before lsp is initialized. Also, we use local-vars hooks to ensure
;; these only run in their respective major modes, and not derived modes. ;; these only run in their respective major modes, and not derived modes.
:hook ((c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) . +cc-init-ffap-integration-h) :hook ((c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) . +cc-init-ffap-integration-h)
:hook ((c-ts-mode-local-vars c++-ts-mode-local-vars) . +cc-init-ffap-integration-h)
;;; Improve fontification in C/C++ (also see `modern-cpp-font-lock') ;;; Improve fontification in C/C++ (also see `modern-cpp-font-lock')
:hook ((c-mode c++-mode) . +cc-fontify-constants-h) :init
(when (modulep! +tree-sitter)
(set-tree-sitter! 'c-mode 'c-ts-mode
'((c :url "https://github.com/tree-sitter/tree-sitter-c")))
(set-tree-sitter! 'c++-mode 'c++-ts-mode
'((cpp :url "https://github.com/tree-sitter/tree-sitter-cpp"))))
:config :config
(set-docsets! 'c-mode "C") (set-docsets! '(c-mode c-ts-mode) "C")
(set-docsets! 'c++-mode "C++" "Boost") (set-docsets! '(c++-mode c++-ts-mode) "C++" "Boost")
(set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\} ?\{)) (set-electric! '(c-mode c++-mode objc-mode java-mode
(set-rotate-patterns! 'c++-mode c-ts-mode c++-ts-mode java-ts-mode)
:chars '(?\n ?\} ?\{))
(set-rotate-patterns! '(c++-mode c++-ts-mode)
:symbols '(("public" "protected" "private") :symbols '(("public" "protected" "private")
("class" "struct"))) ("class" "struct")))
(set-ligatures! '(c-mode c++-mode) (set-ligatures! '(c-mode c-ts-mode c++-mode c++-ts-mode)
;; Functional ;; Functional
;; :def "void " ;; :def "void "
;; Types ;; Types
@@ -53,11 +61,6 @@ This is ignored by ccls.")
(add-to-list 'find-sibling-rules '("/\\([^/]+\\)\\.c\\(c\\|pp\\)?\\'" "\\1.h\\(h\\|pp\\)?\\'")) (add-to-list 'find-sibling-rules '("/\\([^/]+\\)\\.c\\(c\\|pp\\)?\\'" "\\1.h\\(h\\|pp\\)?\\'"))
(add-to-list 'find-sibling-rules '("/\\([^/]+\\)\\.h\\(h\\|pp\\)?\\'" "\\1.c\\(c\\|pp\\)?\\'")) (add-to-list 'find-sibling-rules '("/\\([^/]+\\)\\.h\\(h\\|pp\\)?\\'" "\\1.c\\(c\\|pp\\)?\\'"))
(when (modulep! +tree-sitter)
(add-hook! '(c-mode-local-vars-hook
c++-mode-local-vars-hook)
:append #'tree-sitter!))
;; HACK Suppress 'Args out of range' error in when multiple modifications are ;; HACK Suppress 'Args out of range' error in when multiple modifications are
;; performed at once in a `c++-mode' buffer, e.g. with `iedit' or ;; performed at once in a `c++-mode' buffer, e.g. with `iedit' or
;; multiple cursors. ;; multiple cursors.
@@ -100,52 +103,77 @@ This is ignored by ccls.")
(label . 0)))) (label . 0))))
(when (listp c-default-style) (when (listp c-default-style)
(setf (alist-get 'other c-default-style) "doom")) (setf (alist-get 'other c-default-style) "doom")))
(after! ffap
(add-to-list 'ffap-alist '(c-mode . ffap-c-mode))))
(use-package! modern-cpp-font-lock
:unless (modulep! +tree-sitter)
:hook (c++-mode . modern-c++-font-lock-mode))
;; ;;
;; Major modes ;; Major modes
(after! cmake-mode (use-package! cmake-mode
(set-docsets! 'cmake-mode "CMake") :defer t
:init
(when (and (modulep! +tree-sitter)
(boundp 'cmake-ts-mode)) ; 29+ only
(set-tree-sitter! 'cmake-mode 'cmake-ts-mode
'((cmake :url "https://github.com/uyha/tree-sitter-cmake"))))
:config
(set-docsets! '(cmake-mode cmake-ts-mode) "CMake")
(set-popup-rule! "^\\*CMake Help\\*" :size 0.4 :ttl t) (set-popup-rule! "^\\*CMake Help\\*" :size 0.4 :ttl t)
(set-lookup-handlers! 'cmake-mode (set-lookup-handlers! '(cmake-mode cmake-ts-mode)
:documentation '+cc-cmake-lookup-documentation-fn)) :documentation '+cc-cmake-lookup-documentation-fn)
(when (require 'company-cmake nil t)
(set-company-backend! '(cmake-mode cmake-ts-mode) 'company-cmake))
(when (modulep! +lsp)
(add-hook 'cmake-mode-local-vars-hook #'lsp! 'append)
(add-hook 'cmake-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! company-cmake ; for `cmake-mode' (use-package! glsl-mode
:when (modulep! :completion company) :defer t
:after cmake-mode :init
:config (set-company-backend! 'cmake-mode 'company-cmake)) (when (modulep! +tree-sitter)
(set-tree-sitter! 'glsl-mode 'glsl-ts-mode
'((glsl :url "https://github.com/tree-sitter-grammars/tree-sitter-glsl"))))
:config
(when (require 'company-glsl nil t)
(set-company-backend! 'glsl-mode 'company-glsl))
(when (modulep! +lsp)
(add-hook 'glsl-mode-local-vars-hook #'lsp! 'append)
(add-hook 'glsl-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! cuda-mode
:defer t
:config
(when (modulep! +lsp)
(add-hook 'cuda-mode-local-vars-hook #'lsp! 'append))
)
(use-package! cuda-ts-mode
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'cuda-mode 'cuda-ts-mode
'((cuda :url "https://github.com/tree-sitter-grammars/tree-sitter-cuda")))
:config
(when (modulep! +lsp)
(add-hook 'cuda-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! demangle-mode (use-package! demangle-mode
:hook llvm-mode) :hook llvm-mode)
(use-package! company-glsl ; for `glsl-mode'
:when (modulep! :completion company)
:after glsl-mode
:config (set-company-backend! 'glsl-mode 'company-glsl))
;; ;;
;;; LSP ;;; LSP
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook! '(c-mode-local-vars-hook (add-hook! '(c-mode-local-vars-hook
c-ts-mode-local-vars-hook
c++-mode-local-vars-hook c++-mode-local-vars-hook
objc-mode-local-vars-hook c++-ts-mode-local-vars-hook
cmake-mode-local-vars-hook objc-mode-local-vars-hook)
cuda-mode-local-vars-hook)
:append #'lsp!) :append #'lsp!)
(if (modulep! :tools lsp -eglot) (if (modulep! :tools lsp -eglot)

View File

@@ -4,13 +4,15 @@
(package! cmake-mode (package! cmake-mode
:recipe (:host github :repo "emacsmirror/cmake-mode" :files (:defaults "*")) :recipe (:host github :repo "emacsmirror/cmake-mode" :files (:defaults "*"))
:pin "b08b5d9045308362a623a4f576896d55ffecfd52") :pin "b08b5d9045308362a623a4f576896d55ffecfd52")
(package! cuda-mode :pin "c3dae31b3d1abedf4d0b98840127e2cac73d6ad8")
(package! demangle-mode :pin "04f545adab066708d6151f13da65aaf519f8ac4e") (package! demangle-mode :pin "04f545adab066708d6151f13da65aaf519f8ac4e")
(package! disaster :pin "8b445913221feb0c196e943106643040118bcd77") (package! disaster :pin "8b445913221feb0c196e943106643040118bcd77")
(package! opencl-mode :pin "204d5d9e0f5cb2cbe810f2933230eb08fe2c7695") (package! opencl-mode :pin "204d5d9e0f5cb2cbe810f2933230eb08fe2c7695")
(unless (modulep! +tree-sitter) (when (package! cuda-mode :pin "c3dae31b3d1abedf4d0b98840127e2cac73d6ad8")
(package! modern-cpp-font-lock :pin "43c6b68ff58fccdf9deef11674a172e4eaa8455c")) (when (modulep! +tree-sitter)
(package! cuda-ts-mode
:recipe (:host github :repo "Ergus/cuda-ts-mode")
:pin "807f15150deb3a3060bc36a0e135a27876d7e239")))
(when (package! glsl-mode :pin "86e6bb6cf28d1053366039683a4498401bab9c47") (when (package! glsl-mode :pin "86e6bb6cf28d1053366039683a4498401bab9c47")
(when (modulep! :completion company) (when (modulep! :completion company)

View File

@@ -27,7 +27,11 @@ This module adds support for the Clojure(Script) language.
** Packages ** Packages
- [[doom-package:cider]] - [[doom-package:cider]]
- [[doom-package:clj-refactor]] - [[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:flycheck-clj-kondo]] if [[doom-module::checkers syntax]]
- [[doom-package:jet]]
- [[doom-package:neil]]
** Hacks ** Hacks
- Error messages emitted from CIDER are piped into the REPL buffer when it is - Error messages emitted from CIDER are piped into the REPL buffer when it is

View File

@@ -32,18 +32,30 @@
clojurec-mode clojurec-mode
clojurescript-mode clojurescript-mode
clojurex-mode)) clojurex-mode))
(add-to-list 'lsp-language-id-configuration (cons m "clojure"))))) (add-to-list 'lsp-language-id-configuration (cons m "clojure"))))))
(when (modulep! +tree-sitter)
(add-hook! '(clojure-mode-local-vars-hook (use-package! clojure-ts-mode
clojurec-mode-local-vars-hook :when (modulep! +tree-sitter)
clojurescript-mode-local-vars-hook) :defer t
:append :init
#'tree-sitter!) (setq clojure-ts-auto-remap nil) ; we do it ourselves
;; TODO: PR this upstream (set-tree-sitter! 'clojure-mode 'clojure-ts-mode
(after! tree-sitter-langs '((clojure :url "https://github.com/sogaiu/tree-sitter-clojure")))
(add-to-list 'tree-sitter-major-mode-language-alist '(clojurec-mode . clojure)) (set-tree-sitter! 'clojurec-mode 'clojure-ts-clojurec-mode 'clojure)
(add-to-list 'tree-sitter-major-mode-language-alist '(clojurescript-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-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 ;; `cider-mode' is used instead of the typical `cider' package due to the main
@@ -52,11 +64,18 @@
(use-package! cider-mode (use-package! cider-mode
;; NOTE if `org-directory' doesn't exist, `cider-jack' in won't work ;; NOTE if `org-directory' doesn't exist, `cider-jack' in won't work
:hook (clojure-mode-local-vars . cider-mode) :hook (clojure-mode-local-vars . cider-mode)
:hook (clojure-ts-mode-local-vars . cider-mode)
:init :init
(after! clojure-mode (after! clojure-mode
(set-repl-handler! '(clojure-mode clojurec-mode) #'+clojure/open-repl :persist t) (set-repl-handler! '(clojure-mode clojure-ts-mode
(set-repl-handler! 'clojurescript-mode #'+clojure/open-cljs-repl :persist t) clojurec-mode clojure-ts-clojurec-mode)
(set-eval-handler! '(clojure-mode clojurescript-mode clojurec-mode) #'cider-eval-region)) #'+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 ;; HACK Fix radian-software/radian#446: CIDER tries to calculate the frame's
;; background too early; sometimes before the initial frame has been ;; background too early; sometimes before the initial frame has been
@@ -285,6 +304,7 @@
:when (or (modulep! -lsp) :when (or (modulep! -lsp)
+clojure-load-clj-refactor-with-lsp) +clojure-load-clj-refactor-with-lsp)
:hook (clojure-mode . clj-refactor-mode) :hook (clojure-mode . clj-refactor-mode)
:hook (clojure-ts-mode . clj-refactor-mode)
:config :config
(set-lookup-handlers! 'clj-refactor-mode (set-lookup-handlers! 'clj-refactor-mode
:references #'cljr-find-usages) :references #'cljr-find-usages)

View File

@@ -1,6 +1,10 @@
;; -*- lexical-binding: t; no-byte-compile: t; -*- ;; -*- lexical-binding: t; no-byte-compile: t; -*-
;;; lang/clojure/doctor.el ;;; 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) (when (and (modulep! :checkers syntax)
(modulep! -lsp)) (modulep! -lsp))
(unless (executable-find "clj-kondo") (unless (executable-find "clj-kondo")

View File

@@ -15,6 +15,8 @@
;;; Core packages ;;; Core packages
(package! clojure-mode :pin "b766094aea28bdc7b44ce1960d96434fe7d1d9cf") (package! clojure-mode :pin "b766094aea28bdc7b44ce1960d96434fe7d1d9cf")
(when (modulep! +tree-sitter)
(package! clojure-ts-mode :pin "da56a6938f525c8ead1fb3d79eced4d892df1661"))
(package! clj-refactor :pin "dc1bbc8cdaa723bdbb6669ea7d280625c370755d") (package! clj-refactor :pin "dc1bbc8cdaa723bdbb6669ea7d280625c370755d")
(package! cider :pin "12f10a6f4b3052a9b437f92cf97d551a5964f4cb") (package! cider :pin "12f10a6f4b3052a9b437f92cf97d551a5964f4cb")
(when (modulep! :checkers syntax -flymake) (when (modulep! :checkers syntax -flymake)

View File

@@ -18,7 +18,7 @@ LSP).
(supports =omnisharp-roslyn=). (supports =omnisharp-roslyn=).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires Emacs 29.1+ and [[doom-module::tools tree-sitter]].
- +unity :: - +unity ::
Enable special support for the [[https://unity.com/][Unity game engine]] (particularly, support for Enable special support for the [[https://unity.com/][Unity game engine]] (particularly, support for
HLSL shaders). HLSL shaders).

View File

@@ -1,15 +1,22 @@
;;; lang/csharp/config.el -*- lexical-binding: t; -*- ;;; lang/csharp/config.el -*- lexical-binding: t; -*-
(use-package! csharp-mode (use-package! csharp-mode
:hook (csharp-mode . rainbow-delimiters-mode)
:defer t :defer t
:init
(when (modulep! +tree-sitter)
(set-tree-sitter! 'csharp-mode 'csharp-ts-mode
'((c-sharp :url "https://github.com/tree-sitter/tree-sitter-c-sharp"
:rev "v0.23.1"
:commit "362a8a41b265056592a0c3771664a21d23a71392"))))
:config :config
(set-formatter! 'csharpier '("csharpier" "format" "--write-stdout") (set-formatter! 'csharpier '("csharpier" "format" "--write-stdout")
:modes '(csharp-mode)) :modes '(csharp-mode csharp-ts-mode))
(set-electric! 'csharp-mode :chars '(?\n ?\})) (set-electric! '(csharp-mode csharp-ts-mode) :chars '(?\n ?\}))
(set-rotate-patterns! 'csharp-mode (set-rotate-patterns! '(csharp-mode csharp-ts-mode)
:symbols '(("public" "protected" "private") :symbols '(("public" "protected" "private")
("class" "struct"))) ("class" "struct")))
(set-ligatures! 'csharp-mode (set-ligatures! '(csharp-mode csharp-ts-mode)
;; Functional ;; Functional
:lambda "() =>" :lambda "() =>"
;; Types ;; Types
@@ -30,12 +37,13 @@
:return "return" :return "return"
:yield "yield") :yield "yield")
(sp-local-pair 'csharp-mode "<" ">" (sp-local-pair '(csharp-mode csharp-ts-mode) "<" ">"
:when '(+csharp-sp-point-in-type-p) :when '(+csharp-sp-point-in-type-p)
:post-handlers '(("| " "SPC"))) :post-handlers '(("| " "SPC")))
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'csharp-mode-local-vars-hook #'lsp! 'append)) (add-hook 'csharp-mode-local-vars-hook #'lsp! 'append)
(add-hook 'csharp-ts-mode-local-vars-hook #'lsp! 'append))
(defadvice! +csharp-disable-clear-string-fences-a (fn &rest args) (defadvice! +csharp-disable-clear-string-fences-a (fn &rest args)
"This turns off `c-clear-string-fences' for `csharp-mode'. When "This turns off `c-clear-string-fences' for `csharp-mode'. When
@@ -46,24 +54,13 @@ or terminating simple string."
(apply fn args)))) (apply fn args))))
(use-package! csharp-tree-sitter
:when (modulep! +tree-sitter)
:defer t
:init
(add-hook 'csharp-mode-local-vars-hook #'tree-sitter! 'append)
(when (fboundp #'csharp-tree-sitter-mode)
(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-tree-sitter-mode))
(when (modulep! +lsp)
(add-hook 'csharp-tree-sitter-mode-local-vars-hook #'lsp! 'append))))
;; Unity shaders ;; Unity shaders
(use-package! shader-mode (use-package! shader-mode
:when (modulep! +unity) :when (modulep! +unity)
:mode "\\.shader\\'" :mode "\\.shader\\'"
:config :config
(def-project-mode! +csharp-unity-mode (def-project-mode! +csharp-unity-mode
:modes '(csharp-mode shader-mode) :modes '(csharp-mode csharp-ts-mode shader-mode)
:files (and "Assets" "Library/MonoManager.asset" "Library/ScriptMapper"))) :files (and "Assets" "Library/MonoManager.asset" "Library/ScriptMapper")))

View File

@@ -23,9 +23,13 @@ This module wraps ~dart-mode~, with [[https://microsoft.github.io/language-serve
- +lsp :: - +lsp ::
Enable LSP support for ~dart-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~dart-mode~. Requires [[doom-module::tools lsp]] and a langserver
(supports flutter). (supports flutter).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:dart-mode]] - [[doom-package:dart-mode]]
- [[doom-package:dart-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:flutter.el]] - [[doom-package:flutter.el]]
- [[doom-package:hover.el]] - [[doom-package:hover.el]]

View File

@@ -1,11 +1,7 @@
;;; lang/dart/config.el -*- lexical-binding: t; -*- ;;; lang/dart/config.el -*- lexical-binding: t; -*-
(use-package! dart-mode (defun +dart-common-config (mode)
:defer t (set-ligatures! mode
:config
(when (modulep! +lsp)
(add-hook 'dart-mode-local-vars-hook #'lsp! 'append))
(set-ligatures! '(dart-mode)
;; Functional ;; Functional
:def "Function" :def "Function"
:lambda "() =>" :lambda "() =>"
@@ -23,7 +19,25 @@
:for "for" :for "for"
:return "return" :return "return"
;; Other ;; Other
:yield "yield")) :yield "yield")
(when (modulep! +lsp)
(add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)))
(use-package! dart-mode
:hook (dart-mode . rainbow-delimiters-mode)
:config
(+dart-common-config 'dart-mode))
(use-package! dart-ts-mode
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'dart-mode 'dart-ts-mode
'((dart :url "https://github.com/ast-grep/tree-sitter-dart")))
:config
(+dart-common-config 'dart-ts-mode))
(use-package! flutter (use-package! flutter

View File

@@ -4,5 +4,9 @@
(modulep! :tools lsp)) (modulep! :tools lsp))
"This module requires (:tools lsp)") "This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(unless (executable-find "dart") (unless (executable-find "dart")
(warn! "Dart isn't on PATH.")) (warn! "Dart isn't on PATH."))

View File

@@ -3,6 +3,12 @@
(package! dart-mode :pin "f82ff052309125b93d19bdd3f619266f908f43ce") (package! dart-mode :pin "f82ff052309125b93d19bdd3f619266f908f43ce")
(when (modulep! +tree-sitter)
(package! dart-ts-mode
:recipe (:host github
:repo "50ways2sayhard/dart-ts-mode")
:pin "ab87873f25f7e0cc8d22daa2501aae141dbe98ad"))
(when (and (modulep! +lsp) (when (and (modulep! +lsp)
(modulep! :tools lsp -eglot)) (modulep! :tools lsp -eglot))
(package! lsp-dart :pin "34e2a1191f723792d5f366b314cd6b07de4f1566")) (package! lsp-dart :pin "34e2a1191f723792d5f366b314cd6b07de4f1566"))

View File

@@ -11,11 +11,11 @@ This module provides support for [[https://elixir-lang.org/][Elixir programming
** Module flags ** Module flags
- +lsp :: - +lsp ::
Enable LSP support for ~elixir-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~elixir-mode~. Requires [[doom-module::tools lsp]] and a
(supports [[https://github.com/elixir-lsp/elixir-ls/][elixir-ls]]). langserver (supports [[https://github.com/elixir-lsp/elixir-ls/][elixir-ls]]).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires Emacs 30.1+ and [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:elixir-mode]] - [[doom-package:elixir-mode]]

View File

@@ -8,14 +8,8 @@
;; ;;
;;; Packages ;;; Packages
(use-package! elixir-mode (defun +elixir-common-config (mode)
:defer t (set-ligatures! mode
:init
;; Disable default smartparens config. There are too many pairs; we only want
;; a subset of them (defined below).
(provide 'smartparens-elixir)
:config
(set-ligatures! 'elixir-mode
;; Functional ;; Functional
:def "def" :def "def"
:lambda "fn" :lambda "fn"
@@ -29,7 +23,7 @@
:return "return" :yield "use") :return "return" :yield "use")
;; ...and only complete the basics ;; ...and only complete the basics
(sp-with-modes 'elixir-mode (sp-with-modes mode
(sp-local-pair "do" "end" (sp-local-pair "do" "end"
:when '(("RET" "<evil-ret>")) :when '(("RET" "<evil-ret>"))
:unless '(sp-in-comment-p sp-in-string-p) :unless '(sp-in-comment-p sp-in-string-p)
@@ -37,16 +31,41 @@
(sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p))
(sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p))) (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))
(when (modulep! +lsp +tree-sitter) (when (modulep! +lsp)
(add-hook 'elixir-ts-mode-local-vars-hook #'lsp! 'append)) (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)))
(use-package! elixir-mode
:defer t
:init
;; Disable default smartparens config. There are too many pairs; we only want
;; a subset of them (defined below).
(provide 'smartparens-elixir)
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'elixir-mode-local-vars-hook #'lsp! 'append)
(after! lsp-mode (after! lsp-mode
(add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]_build\\'"))) (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]_build\\'")))
:config
(+elixir-common-config 'elixir-mode))
(when (modulep! +tree-sitter)
(add-hook 'elixir-mode-local-vars-hook #'tree-sitter! 'append))) (use-package! elixir-ts-mode ; 30.1+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'elixir-mode 'elixir-ts-mode
'((elixir :url "https://github.com/elixir-lang/tree-sitter-elixir"
:commit "02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e")
(heex :url "https://github.com/phoenixframework/tree-sitter-heex"
:commit "f6b83f305a755cd49cf5f6a66b2b789be93dc7b9")))
:config
(+elixir-common-config 'elixir-ts-mode))
(use-package! heex-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'heex-ts-mode) ; 30.1+ only
:mode "\\.[hl]?eex\\'")
(use-package! flycheck-credo (use-package! flycheck-credo

View File

@@ -4,3 +4,7 @@
(assert! (or (not (modulep! +tree-sitter)) (assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'elixir-ts-mode))
"Can't find `elixir-ts-mode'; Emacs 30.1+ is required")

View File

@@ -13,9 +13,6 @@ This module adds [[https://elm-lang.org/][Elm]] support to Doom Emacs.
- +lsp :: - +lsp ::
Enable LSP support for ~elm-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~elm-mode~. Requires [[doom-module::tools lsp]] and a langserver
(supports [[https://github.com/elm-tooling/elm-language-server][elm-language-server]]). (supports [[https://github.com/elm-tooling/elm-language-server][elm-language-server]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:elm-mode]] - [[doom-package:elm-mode]]

View File

@@ -5,9 +5,6 @@
(add-hook 'elm-mode-local-vars-hook #'lsp! 'append) (add-hook 'elm-mode-local-vars-hook #'lsp! 'append)
(set-company-backend! 'elm-mode 'company-elm)) (set-company-backend! 'elm-mode 'company-elm))
(when (modulep! +tree-sitter)
(add-hook 'elm-mode-local-vars-hook #'tree-sitter! 'append))
(set-repl-handler! 'elm-mode #'run-elm-interactive) (set-repl-handler! 'elm-mode #'run-elm-interactive)
(set-ligatures! 'elm-mode (set-ligatures! 'elm-mode
:null "null" :null "null"

View File

@@ -1,5 +1,2 @@
;;; lang/elm/doctor.el -*- lexical-binding: t; -*- ;;; lang/elm/doctor.el -*- lexical-binding: t; -*-
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")

View File

@@ -5,9 +5,16 @@
:mode ("/rebar\\.config\\(?:\\.script\\)?\\'" . erlang-mode) :mode ("/rebar\\.config\\(?:\\.script\\)?\\'" . erlang-mode)
:mode ("/\\(?:app\\|sys\\)\\.config\\'" . erlang-mode) :mode ("/\\(?:app\\|sys\\)\\.config\\'" . erlang-mode)
:config :config
(set-formatter! 'erlfmt '("rebar3" "fmt" "-") :modes '(erlang-mode)) (set-formatter! 'erlfmt '("rebar3" "fmt" "-")
:modes '(erlang-mode erlang-ts-mode))
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'erlang-mode-local-vars-hook #'lsp! 'append)) (add-hook 'erlang-mode-local-vars-hook #'lsp! 'append)))
(when (modulep! +tree-sitter)
(add-hook 'erlang-mode-local-vars-hook #'tree-sitter! 'append))) (use-package! erlang-ts
:when (modulep! +tree-sitter)
:when (fboundp 'erlang-ts-mode)
:defer t
:init
(set-tree-sitter! 'erlang-mode 'erlang-ts-mode
'((erlang "https://github.com/WhatsApp/tree-sitter-erlang"))))

View File

@@ -5,6 +5,10 @@
(modulep! :tools lsp)) (modulep! :tools lsp))
"This module requires (:tools lsp)") "This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(when (modulep! :editor format) (when (modulep! :editor format)
(unless (and (executable-find "rebar3") (zerop (car (doom-call-process "rebar3" "fmt" "-v")))) (unless (and (executable-find "rebar3") (zerop (car (doom-call-process "rebar3" "fmt" "-v"))))
(warn! "Couldn't find erlfmt. Formatting will be disabled."))) (warn! "Couldn't find erlfmt. Formatting will be disabled.")))

View File

@@ -2,3 +2,6 @@
;;; lang/erlang/packages.el ;;; lang/erlang/packages.el
(package! erlang :pin "b9d3ec017da091168918a2901a1cef4cb062fd2a") (package! erlang :pin "b9d3ec017da091168918a2901a1cef4cb062fd2a")
(when (modulep! +tree-sitter)
(package! erlang-ts :pin "eb579dd55fbb2cf721290939e7b3a50be19c0305"))

View File

@@ -13,9 +13,6 @@ SAS, Julia and Stata.
** Module flags ** Module flags
- +stan :: - +stan ::
Enable support for ~stan-mode~, including code completion and syntax checking. Enable support for ~stan-mode~, including code completion and syntax checking.
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Currently only supports ~ess-r-mode~. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:ess]] - [[doom-package:ess]]

View File

@@ -24,9 +24,6 @@
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'ess-r-mode-local-vars-hook #'lsp! 'append)) (add-hook 'ess-r-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'ess-r-mode-local-vars-hook #'tree-sitter! 'append))
(set-repl-handler! 'ess-r-mode #'run-ess-r) (set-repl-handler! 'ess-r-mode #'run-ess-r)
(set-repl-handler! 'ess-julia-mode #'run-ess-julia) (set-repl-handler! 'ess-julia-mode #'run-ess-julia)
(set-lookup-handlers! '(ess-r-mode ess-julia-mode) (set-lookup-handlers! '(ess-r-mode ess-julia-mode)

View File

@@ -3,19 +3,16 @@
;; ;;
;;; Packages ;;; Packages
(after! go-mode (defun +go-common-config (mode)
(set-docsets! 'go-mode "Go") (set-docsets! mode "Go")
(set-repl-handler! 'go-mode #'gorepl-run) (set-repl-handler! mode #'gorepl-run)
(set-lookup-handlers! 'go-mode (set-lookup-handlers! mode
:documentation #'godoc-at-point) :documentation #'godoc-at-point)
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'go-mode-local-vars-hook #'lsp! 'append)) (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append))
(when (modulep! +tree-sitter) (map! :map ,(intern (format "%s-map" mode))
(add-hook 'go-mode-local-vars-hook #'tree-sitter! 'append))
(map! :map go-mode-map
:localleader :localleader
"a" #'go-tag-add "a" #'go-tag-add
"d" #'go-tag-remove "d" #'go-tag-remove
@@ -47,10 +44,34 @@
"a" #'+go/bench-all)))) "a" #'+go/bench-all))))
(after! go-mode
(+go-common-config 'go-mode))
(use-package! go-ts-mode ; 29.1+ only
:when (modulep! +tree-sitter)
:mode ("/go\\.mod\\'" . go-mod-ts-mode-maybe)
:init
(set-tree-sitter! 'go-mode 'go-ts-mode
'((go :url "https://github.com/tree-sitter/tree-sitter-go"
:commit "12fe553fdaaa7449f764bc876fd777704d4fb752")))
(set-tree-sitter! nil 'go-mod-ts-mode
'((gomod :url "https://github.com/camdencheek/tree-sitter-go-mod"
:commit "3b01edce2b9ea6766ca19328d1850e456fde3103")))
(when (fboundp 'go-work-ts-mode) ; 30.1+ only
(add-to-list 'auto-mode-alist '("/go\\.work\\'" . go-work-ts-mode-maybe))
(set-tree-sitter! nil 'go-work-ts-mode
'((gowork :url "https://github.com/omertuc/tree-sitter-go-work"
:commit "949a8a470559543857a62102c84700d291fc984c"))))
:config
(+go-common-config 'go-ts-mode))
(use-package! gorepl-mode (use-package! gorepl-mode
:commands gorepl-run-load-current-file) :commands gorepl-run-load-current-file)
(use-package! flycheck-golangci-lint (use-package! flycheck-golangci-lint
:when (modulep! :checkers syntax -flymake) :when (modulep! :checkers syntax -flymake)
:hook (go-mode . flycheck-golangci-lint-setup)) :hook (go-mode . flycheck-golangci-lint-setup)
:hook (go-ts-mode . flycheck-golangci-lint-setup))

View File

@@ -9,6 +9,10 @@
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'go-ts-mode))
"Can't find `go-ts-mode'; Emacs 31.1+ is required")
(unless (executable-find "gore") (unless (executable-find "gore")
(warn! "Couldn't find gore. REPL will not work")) (warn! "Couldn't find gore. REPL will not work"))

View File

@@ -26,10 +26,14 @@ It includes:
- +lsp :: - +lsp ::
Enable LSP support for ~graphql-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~graphql-mode~. Requires [[doom-module::tools lsp]] and a langserver
([[https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme][graphql-language-service-cli]]). ([[https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme][graphql-language-service-cli]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:company-graphql]] unless [[doom-module:+lsp]] - [[doom-package:company-graphql]] unless [[doom-module:+lsp]]
- [[doom-package:graphql-mode]] - [[doom-package:graphql-mode]]
- [[doom-package:graphql-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:graphql-doc]] - [[doom-package:graphql-doc]]
** Hacks ** Hacks

View File

@@ -1,21 +1,18 @@
;;; lang/graphql/config.el -*- lexical-binding: t; -*- ;;; lang/graphql/config.el -*- lexical-binding: t; -*-
(after! graphql-mode ;;
(defface nerd-icons-rhodamine ;;; Packages
'((t (:foreground "#E10098")))
"Face for GraphQL icon." (defun +graphql-common-config (mode)
:group 'nerd-icons-faces)
(if (modulep! +lsp) (if (modulep! +lsp)
(add-hook 'graphql-mode-local-vars-hook #'lsp! 'append) (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)
(set-company-backend! 'graphql-mode 'company-graphql)) (set-company-backend! mode 'company-graphql))
(set-docsets! 'graphql-mode :add "GraphQL Specification") (set-docsets! mode :add "GraphQL Specification")
(set-electric! mode
(set-electric! 'graphql-mode
:chars '(?\} ?\)) :chars '(?\} ?\))
:words '("or" "and")) :words '("or" "and"))
(set-ligatures! mode
(set-ligatures! 'graphql-mode
:null "null" :null "null"
:true "true" :false "false" :true "true" :false "false"
:int "Int" :str "String" :int "Int" :str "String"
@@ -25,5 +22,26 @@
:not "not" :not "not"
:and "and" :or "or")) :and "and" :or "or"))
(after! graphql-mode
(defface nerd-icons-rhodamine
'((t (:foreground "#E10098")))
"Face for GraphQL icon."
:group 'nerd-icons-faces)
(add-hook 'graphql-mode-hook #'rainbow-delimiters-mode)
(+graphql-common-config 'graphql-mode))
(use-package! graphql-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'graphql-mode 'graphql-ts-mode
'((graphql :url "https://github.com/bkegley/tree-sitter-graphql")))
:config
(+graphql-common-config 'graphql-ts-mode))
(use-package! graphql-doc (use-package! graphql-doc
:after graphql-mode) :after graphql-mode)

View File

@@ -0,0 +1,5 @@
;;; lang/graphql/doctor.el -*- lexical-binding: t; -*-
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")

View File

@@ -7,3 +7,5 @@
(package! company-graphql (package! company-graphql
:recipe (:host github :repo "thaenalpha/company-graphql") :recipe (:host github :repo "thaenalpha/company-graphql")
:pin "aed9f5109e877944a895d08fc08bad103f03096b")) :pin "aed9f5109e877944a895d08fc08bad103f03096b"))
(when (modulep! +tree-sitter)
(package! graphql-ts-mode :pin "e933f235408ea195762700fd07c2d828e8f09aac"))

View File

@@ -8,10 +8,6 @@
:config :config
(set-company-backend! 'graphviz-dot-mode 'company-graphviz-dot-backend) (set-company-backend! 'graphviz-dot-mode 'company-graphviz-dot-backend)
(set-formatter! 'graphviz-dot #'+graphviz-formatter :modes '(graphviz-dot-mode)) (set-formatter! 'graphviz-dot #'+graphviz-formatter :modes '(graphviz-dot-mode))
(set-tree-sitter-lang! 'graphviz-dot-mode 'dot)
(when (modulep! +tree-sitter)
(add-hook 'graphiz-dot-mode-hook #'tree-sitter!))
(after! dtrt-indent (after! dtrt-indent
(add-to-list 'dtrt-indent-hook-mapping-list '(graphviz-mode graphviz-dot-indent-width))) (add-to-list 'dtrt-indent-hook-mapping-list '(graphviz-mode graphviz-dot-indent-width)))

View File

@@ -21,6 +21,7 @@ This module adds Haskell support to Doom Emacs.
** Packages ** Packages
- [[doom-package:haskell-mode]] - [[doom-package:haskell-mode]]
- [[doom-package:haskell-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:lsp-haskell]] if [[doom-module:+lsp]] - [[doom-package:lsp-haskell]] if [[doom-module:+lsp]]
** Hacks ** Hacks

View File

@@ -28,9 +28,6 @@
#'haskell-collapse-mode ; support folding haskell code blocks #'haskell-collapse-mode ; support folding haskell code blocks
#'interactive-haskell-mode) #'interactive-haskell-mode)
(when (modulep! +tree-sitter)
(add-hook 'haskell-mode-local-vars-hook #'tree-sitter! 'append))
(add-to-list 'completion-ignored-extensions ".hi") (add-to-list 'completion-ignored-extensions ".hi")
(map! :map haskell-mode-map (map! :map haskell-mode-map
@@ -47,6 +44,18 @@
"H" #'haskell-hide-toggle-all)) "H" #'haskell-hide-toggle-all))
(use-package! haskell-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'haskell-ts-mode)
:defer t
:init
(set-tree-sitter! 'haskell-mode 'haskell-ts-mode
'((haskell :url "https://github.com/tree-sitter/tree-sitter-haskell")))
:config
(set-repl-handler! 'haskell-ts-mode #'run-haskell :persist t)
(set-eglot-client! 'haskell-ts-mode '("haskell-language-server-wrapper" "--lsp")))
(use-package! lsp-haskell (use-package! lsp-haskell
:when (modulep! +lsp) :when (modulep! +lsp)
:defer t :defer t

View File

@@ -5,6 +5,10 @@
(modulep! :tools lsp)) (modulep! :tools lsp))
"This module requires (:tools lsp)") "This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(unless (executable-find "cabal") (unless (executable-find "cabal")
(warn! "Couldn't find cabal. haskell-mode may have issues.")) (warn! "Couldn't find cabal. haskell-mode may have issues."))

View File

@@ -2,6 +2,8 @@
;;; lang/haskell/packages.el ;;; lang/haskell/packages.el
(package! haskell-mode :pin "e9c356739310332afe59b10ffa2e6c3e76f124e3") (package! haskell-mode :pin "e9c356739310332afe59b10ffa2e6c3e76f124e3")
(when (modulep! +tree-sitter)
(package! haskell-ts-mode :pin "b47211699944997bfb03fd88b1157dd71727bad7"))
(when (and (modulep! +lsp) (when (and (modulep! +lsp)
(modulep! :tools lsp -eglot)) (modulep! :tools lsp -eglot))

View File

@@ -12,7 +12,9 @@ This module adds rudimentary support for the [[https://janet-lang.org/][Janet pr
[[doom-contrib-maintainer:][Become a maintainer?]] [[doom-contrib-maintainer:][Become a maintainer?]]
** Module flags ** Module flags
/This module has no flags./ - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:janet-mode]] - [[doom-package:janet-mode]]

View File

@@ -24,16 +24,10 @@
(put sym 'janet-indent-function 'defun))) (put sym 'janet-indent-function 'defun)))
;; (use-package! janet-ts-mode (use-package! janet-ts-mode
;; :when (modulep! +tree-sitter) :when (modulep! +tree-sitter)
;; :defer t :defer t
;; :init :init
;; (set-tree-sitter! 'janet-mode 'janet-ts-mode (set-tree-sitter! 'janet-mode 'janet-ts-mode
;; `(janet-simple :url "https://github.com/sogaiu/tree-sitter-janet-simple" `((janet-simple :url "https://github.com/sogaiu/tree-sitter-janet-simple"
;; :cc ,(if (featurep :system 'windows) "gcc.exe"))) :cc ,(if (featurep :system 'windows) "gcc.exe")))))
;; :config
;; ;; HACK: These autoloads are inserted twice by this package, so remove them so
;; ;; this module can be the single source of truth.
;; (cl-callf2 delete '("\\.janet\\'" . janet-ts-mode) auto-mode-alist)
;; (cl-callf2 delete '("\\.jdn\\'" . janet-ts-mode) auto-mode-alist)
;; (cl-callf2 delete '("janet" . janet-ts-mode) interpreter-mode-alist))

View File

@@ -5,7 +5,7 @@
:recipe (:files ("*.el")) :recipe (:files ("*.el"))
:pin "9e3254a0249d720d5fa5603f1f8c3ed0612695af") :pin "9e3254a0249d720d5fa5603f1f8c3ed0612695af")
;; (when (modulep! +tree-sitter) (when (modulep! +tree-sitter)
;; (package! janet-ts-mode (package! janet-ts-mode
;; :recipe (:host github :repo "sogaiu/janet-ts-mode") :recipe (:host github :repo "sogaiu/janet-ts-mode")
;; :pin "ac684edf57e4d4e085cf99d5ad2ee084b46b8123")) :pin "ac684edf57e4d4e085cf99d5ad2ee084b46b8123"))

View File

@@ -28,13 +28,21 @@ If the depth is 2, the first two directories are removed: net.lissner.game.")
(modulep! :tools lsp -eglot)) (modulep! :tools lsp -eglot))
(load! "+lsp")) (load! "+lsp"))
(when (modulep! +tree-sitter)
(add-hook 'java-mode-local-vars-hook #'tree-sitter! 'append))
;; ;;
;;; Common packages ;;; Common packages
(use-package! java-ts-mode ; 29.1+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'java-mode 'java-ts-mode
'((java :url "https://github.com/tree-sitter/tree-sitter-java"
:commit "94703d5a6bed02b98e438d7cad1136c01a60ba2c")
(doxygen :url "https://github.com/tree-sitter-grammars/tree-sitter-doxygen"
:commit "1e28054cb5be80d5febac082706225e42eff14e6"))))
(use-package! android-mode (use-package! android-mode
:commands android-mode :commands android-mode
:init :init

View File

@@ -9,6 +9,10 @@
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'java-ts-mode))
"Can't find `java-ts-mode'; Emacs 29.1+ is required")
(unless (executable-find "javac") (unless (executable-find "javac")
(warn! "Couldn't find the javac executable, are you sure the JDK is installed?")) (warn! "Couldn't find the javac executable, are you sure the JDK is installed?"))

View File

@@ -6,13 +6,14 @@
* Description :unfold: * Description :unfold:
This module adds [[https://www.javascript.com/][JavaScript]] and [[https://www.typescriptlang.org/][TypeScript]] support to Doom Emacs. This module adds [[https://www.javascript.com/][JavaScript]] and [[https://www.typescriptlang.org/][TypeScript]] support to Doom Emacs.
- Code completion ([[doom-package:tide]]) - JSX/TSX support (requires [[doom-module:+tree-sitter]] and Emacs 29.1+)
- REPL support ([[doom-package:nodejs-repl]]) - LSP Integration
- Refactoring commands ([[doom-package:js2-refactor]]) - Code completion (with [[doom-module::completion corfu]] (recommended) or
- Syntax checking ([[doom-package:flycheck]]) [[doom-module::completion company]])
- Browser code injection with [[doom-package:skewer-mode]] - Syntax checking (with [[doom-module::checkers syntax]])
- Coffeescript & JSX support - Jump-to-definitions and references support
- Jump-to-definitions and references support ([[doom-package:xref]]) - Code formatting (with [[doom-module::editor format]] and [[https://prettier.io/docs/en/install.html][prettier]])
- REPL support (with [[doom-package:nodejs-repl]] and/or [[doom-module::tools eval]])
** Maintainers ** Maintainers
- [[doom-user:][@elken]] - [[doom-user:][@elken]]
@@ -23,22 +24,17 @@ This module adds [[https://www.javascript.com/][JavaScript]] and [[https://www.t
** Module flags ** Module flags
- +lsp :: - +lsp ::
Enable LSP support for ~js2-mode~, ~rjsx-mode~, JS in ~web-mode~, and Enable LSP support for ~js-mode~, ~js-ts-mode~, ~typesript-mode~, and
~typescript-mode~. Requires [[doom-module::tools lsp]] and a langserver (supports ts-ls and ~typescript-ts-mode. Requires [[doom-module::tools lsp]] and a langserver
deno-ls). (supports ts-ls and deno-ls).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires [[doom-module::tools tree-sitter]]. Requires Emacs 29.1+.
Required for JSX/TSX support.
** Packages ** Packages
- [[doom-package:js2-refactor]]
- [[doom-package:nodejs-repl]] - [[doom-package:nodejs-repl]]
- [[doom-package:npm-mode]] - [[doom-package:typescript-mode]] unless [[doom-module:+tree-sitter]]
- [[doom-package:rjsx-mode]]
- [[doom-package:skewer-mode]] (DEPRECATED)
- [[doom-package:tide]]
- [[doom-package:typescript-mode]]
- [[doom-package:xref-js2]] if [[doom-module::tools lookup]]
** TODO Hacks ** TODO Hacks
#+begin_quote #+begin_quote
@@ -59,97 +55,13 @@ This module requires [[https://nodejs.org/en/][NodeJS]] and one of [[https://www
- openSUSE: ~$ zypper install nodejs npm~ - openSUSE: ~$ zypper install nodejs npm~
** Formatter ** Formatter
Formatting is handled using the [[doom-module::editor format]] module via [[https://prettier.io/docs/en/install.html][prettier]]. Formatting is handled using the [[doom-module::editor format]] module via [[https://prettier.io/docs/en/install.html][prettier]].
* TODO Usage * TODO Usage
#+begin_quote #+begin_quote
󱌣 /This module's usage documentation is incomplete./ [[doom-contrib-module:][Complete it?]] 󱌣 This module has no usage documentation yet. [[doom-contrib-module:][Write some?]]
#+end_quote #+end_quote
~rjsx-mode~ is used for all javascript buffers.
** Commands
*** rjsx-mode
| command | key / ex command | description |
|----------------------------------+------------------+------------------------------------------------------------|
| ~+javascript/open-repl~ | ~:repl~ | Open the NodeJS REPL (or send the current selection to it) |
| ~+javascript/skewer-this-buffer~ | [[kbd:][<localleader> S]] | Attaches a browser to the current buffer |
*** Tide
| command | key / ex command | description |
|-------------------------+---------------------+------------------------|
| ~tide-restart-server~ | [[kbd:][<localleader> R]] | Restart tide server |
| ~tide-reformat~ | [[kbd:][<localleader> f]] | Reformat region |
| ~tide-rename-symbol~ | [[kbd:][<localleader> r r s]] | Rename symbol at point |
| ~tide-organize-imports~ | [[kbd:][<localleader> r o i]] | Organize imports |
*** Refactoring (js2-refactor-mode)
| command | key / ex command | description |
|---------------------------------------------------+---------------------+--------------------------------------------------------------------------------------------------------------------|
| ~js2r-expand-node-at-point~ | [[kbd:][<localleader> r e e]] | Expand bracketed list according to node type at point |
| ~js2r-contract-node-at-point~ | [[kbd:][<localleader> r c c]] | Contract bracketed list according to node type at point |
| ~js2r-extract-function~ | [[kbd:][<localleader> r e f]] | Extracts the marked expressions out into a new named function. |
| ~js2r-extract-method~ | [[kbd:][<localleader> r e m]] | Extracts the marked expressions out into a new named method in an object literal. |
| ~js2r-toggle-function-expression-and-declaration~ | [[kbd:][<localleader> r t f]] | Toggle between function name() {} and var name = function (); |
| ~js2r-toggle-arrow-function-and-expression~ | [[kbd:][<localleader> r t a]] | Toggle between function expression to arrow function. |
| ~js2r-toggle-function-async~ | [[kbd:][<localleader> r t s]] | Toggle between an async and a regular function. |
| ~js2r-introduce-parameter~ | [[kbd:][<localleader> r i p]] | Changes the marked expression to a parameter in a local function. |
| ~js2r-localize-parameter~ | [[kbd:][<localleader> r l p]] | Changes a parameter to a local var in a local function. |
| ~js2r-wrap-buffer-in-iife~ | [[kbd:][<localleader> r w i]] | Wraps the entire buffer in an immediately invoked function expression |
| ~js2r-inject-global-in-iife~ | [[kbd:][<localleader> r i g]] | Creates a shortcut for a marked global by injecting it in the wrapping immediately invoked function expression |
| ~js2r-add-to-globals-annotation~ | [[kbd:][<localleader> r a g]] | Creates a /*global */ annotation if it is missing, and adds the var at point to it. |
| ~js2r-extract-var~ | [[kbd:][<localleader> r e v]] | Takes a marked expression and replaces it with a var. |
| ~js2r-extract-let~ | [[kbd:][<localleader> r e l]] | Similar to extract-var but uses a let-statement. |
| ~js2r-extract-const~ | [[kbd:][<localleader> r e c]] | Similar to extract-var but uses a const-statement. |
| ~js2r-inline-var~ | [[kbd:][<localleader> r i v]] | Replaces all instances of a variable with its initial value. |
| ~js2r-rename-var~ | [[kbd:][<localleader> r r v]] | Renames the variable on point and all occurrences in its lexical scope. |
| ~js2r-var-to-this~ | [[kbd:][<localleader> r v t]] | Changes local var a to be this.a instead. |
| ~js2r-arguments-to-object~ | [[kbd:][<localleader> r a o]] | Replaces arguments to a function call with an object literal of named arguments. |
| ~js2r-ternary-to-if~ | [[kbd:][<localleader> r 3 i]] | Converts ternary operator to if-statement. |
| ~js2r-split-var-declaration~ | [[kbd:][<localleader> r s v]] | Splits a var with multiple vars declared, into several var statements. |
| ~js2r-split-string~ | [[kbd:][<localleader> r s s]] | Splits a string. |
| ~js2r-string-to-template~ | [[kbd:][<localleader> r s t]] | Converts a string into a template string. |
| ~js2r-unwrap~ | [[kbd:][<localleader> r u w]] | Replaces the parent statement with the selected region. |
| ~js2r-log-this~ | [[kbd:][<localleader> r l t]] | Adds a console.log() statement for what is at point (or region). With a prefix argument, use JSON pretty-printing. |
| ~js2r-debug-this~ | [[kbd:][<localleader> r d t]] | Adds a debug() statement for what is at point (or region). |
| ~js2r-forward-slurp~ | [[kbd:][<localleader> r s l]] | Moves the next statement into current function, if-statement, for-loop or while-loop. |
| ~js2r-forward-barf~ | [[kbd:][<localleader> r b a]] | Moves the last child out of current function, if-statement, for-loop or while-loop. |
| ~js2r-kill~ | [[kbd:][<localleader> r k]] | Kills to the end of the line, but does not cross semantic boundaries. |
*** skewer-mode
**** general
| command | key / ex command | description |
|-------------------------------+-------------------+---------------------------------------|
| ~skewer-eval-last-expression~ | [[kbd:][<localleader> s E]] | Evaluate last expression |
| ~skewer-eval-defun~ | [[kbd:][<localleader> s e]] | Evaluate function definition at point |
| ~skewer-load-buffer~ | [[kbd:][<localleader> s f]] | Load buffer into REPL |
**** css
| command | key / ex command | description |
|---------------------------------------+-------------------+-------------------------------|
| ~skewer-css-eval-current-declaration~ | [[kbd:][<localleader> s e]] | Evaluate declaration at point |
| ~skewer-css-eval-current-rule~ | [[kbd:][<localleader> s r]] | Evaluate rule at point |
| ~skewer-css-eval-buffer~ | [[kbd:][<localleader> s b]] | Evaluate buffer |
| ~skewer-css-clear-all~ | [[kbd:][<localleader> s c]] | Clear all rules |
**** html
| command | key / ex command | description |
|------------------------+-------------------+-----------------------|
| ~skewer-html-eval-tag~ | [[kbd:][<localleader> s e]] | Evaluate tag at point |
*** npm-mode
| command | key / ex command | description |
|---------------------------------+-------------------+------------------------------------------------------------------|
| ~npm-mode-npm-init~ | [[kbd:][<localleader> n n]] | Initialize npm project |
| ~npm-mode-npm-install~ | [[kbd:][<localleader> n i]] | Install npm package |
| ~npm-mode-npm-install-save~ | [[kbd:][<localleader> n s]] | Install npm package and save to package.json |
| ~npm-mode-npm-install-save-dev~ | [[kbd:][<localleader> n d]] | Install npm package and save to package.json as a dev dependency |
| ~npm-mode-npm-uninstall~ | [[kbd:][<localleader> n u]] | Uninstall npm package |
| ~npm-mode-npm-list~ | [[kbd:][<localleader> n l]] | List npm packages |
| ~npm-mode-npm-run~ | [[kbd:][<localleader> n r]] | Run npm task |
| ~npm-mode-visit-project-file~ | [[kbd:][<localleader> n v]] | Find file in npm project |
* TODO Configuration * TODO Configuration
#+begin_quote #+begin_quote
󱌣 This module has no configuration documentation yet. [[doom-contrib-module:][Write some?]] 󱌣 This module has no configuration documentation yet. [[doom-contrib-module:][Write some?]]

View File

@@ -8,303 +8,108 @@
;; ;;
;;; Major modes ;;; Major modes
(dolist (feature '(rjsx-mode (defun +javascript-common-config (mode)
typescript-mode (unless (eq mode 'nodejs-repl-mode)
web-mode (set-repl-handler! mode #'+javascript/open-repl)
(nodejs-repl-mode . nodejs-repl))) (set-electric! mode :chars '(?\} ?\) ?. ?:))
(let ((pkg (or (cdr-safe feature) feature)) (set-ligatures! mode
(mode (or (car-safe feature) feature))) ;; Functional
(with-eval-after-load pkg :def "function"
(set-docsets! mode "JavaScript" :lambda "() =>"
"AngularJS" "Backbone" "BackboneJS" "Bootstrap" "D3JS" "EmberJS" "Express" :composition "compose"
"ExtJS" "JQuery" "JQuery_Mobile" "JQuery_UI" "KnockoutJS" "Lo-Dash" ;; Types
"MarionetteJS" "MomentJS" "NodeJS" "PrototypeJS" "React" "RequireJS" :null "null"
"SailsJS" "UnderscoreJS" "VueJS" "ZeptoJS") :true "true" :false "false"
(set-ligatures! mode ;; Flow
;; Functional :not "!"
:def "function" :and "&&" :or "||"
:lambda "() =>" :for "for"
:composition "compose" :return "return"
;; Types ;; Other
:null "null" :yield "import")
:true "true" :false "false"
;; Flow (when (modulep! +lsp)
:not "!" (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)))
:and "&&" :or "||"
:for "for" (pcase mode
:return "return" ((or 'js-mode 'js-ts-mode 'nodejs-repl-mode)
;; Other (set-docsets! mode "JavaScript"
:yield "import")))) "AngularJS" "Backbone" "BackboneJS" "Bootstrap" "D3JS" "EmberJS" "Express"
"ExtJS" "JQuery" "JQuery_Mobile" "JQuery_UI" "KnockoutJS" "Lo-Dash"
"MarionetteJS" "MomentJS" "NodeJS" "PrototypeJS" "React" "RequireJS"
"SailsJS" "UnderscoreJS" "VueJS" "ZeptoJS"))
((or 'typescript-mode 'typescript-ts-mode)
(set-docsets! mode :add "TypeScript" "AngularTS")
(set-electric! mode :chars '(?\} ?\)) :words '("||" "&&")))))
(use-package! rjsx-mode (use-package! js-mode
:mode "\\.[mc]?js\\'" :mode "\\.[mc]?js\\'"
:mode "\\.es6\\'" :mode "\\.es6\\'"
:mode "\\.pac\\'" :mode "\\.pac\\'"
:interpreter "node"
:init
;; Parse node stack traces in the compilation buffer
(after! compilation
(add-to-list 'compilation-error-regexp-alist 'node)
(add-to-list 'compilation-error-regexp-alist-alist
'(node "^[[:blank:]]*at \\(.*(\\|\\)\\(.+?\\):\\([[:digit:]]+\\):\\([[:digit:]]+\\)"
2 3 4)))
:config :config
(set-repl-handler! 'rjsx-mode #'+javascript/open-repl) (setq js-chain-indent t)
(set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?:)) (+javascript-common-config 'js-mode))
(setq js-chain-indent t
;; These have become standard in the JS community
js2-basic-offset 2
;; Don't mishighlight shebang lines
js2-skip-preprocessor-directives t
;; let flycheck handle this
js2-mode-show-parse-errors nil
js2-mode-show-strict-warnings nil
;; Flycheck provides these features, so disable them: conflicting with
;; the eslint settings.
js2-strict-missing-semi-warning nil
;; maximum fontification
js2-highlight-level 3
js2-idle-timer-delay 0.15)
(setq-hook! 'rjsx-mode-hook (use-package! js-ts-mode ; 29.1+ only
;; Indent switch-case another step :when (modulep! +tree-sitter)
js-switch-indent-offset js2-basic-offset) :defer t
:init
(use-package! xref-js2 (set-tree-sitter! 'js-mode 'js-ts-mode
:when (modulep! :tools lookup) '((javascript :url "https://github.com/tree-sitter/tree-sitter-javascript"
:init :rev "v0.23.0"
(setq xref-js2-search-program 'rg) :commit "108b2d4d17a04356a340aea809e4dd5b801eb40d")
(set-lookup-handlers! 'rjsx-mode (jsdoc :url "https://github.com/tree-sitter/tree-sitter-jsdoc"
:xref-backend #'xref-js2-xref-backend)) :rev "v0.23.0"
:commit "b253abf68a73217b7a52c0ec254f4b6a7bb86665")))
;; HACK `rjsx-electric-gt' relies on js2's parser to tell it when the cursor (+javascript-common-config 'js-ts-mode))
;; is in a self-closing tag, so that it can insert a matching ending tag
;; at point. The parser doesn't run immediately however, so a fast typist
;; can outrun it, causing tags to stay unclosed, so force it to parse:
(defadvice! +javascript-reparse-a (n)
;; if n != 1, rjsx-electric-gt calls rjsx-maybe-reparse itself
:before #'rjsx-electric-gt
(if (= n 1) (rjsx-maybe-reparse))))
(use-package! typescript-mode (use-package! typescript-mode
:defer t :unless (modulep! +tree-sitter)
:init :mode "\\.ts\\'"
(when (modulep! :lang web)
(autoload 'typescript-tsx-mode "typescript-mode" nil t))
;; REVIEW We associate TSX files with `typescript-tsx-mode' derived from
;; `web-mode' because `typescript-mode' does not officially support
;; JSX/TSX. See emacs-typescript/typescript.el#4
(add-to-list 'auto-mode-alist
(cons "\\.tsx\\'"
(if (modulep! :lang web)
#'typescript-tsx-mode
#'typescript-mode)))
(when (modulep! :checkers syntax -flymake)
(after! flycheck
(flycheck-add-mode 'javascript-eslint 'web-mode)
(flycheck-add-mode 'javascript-eslint 'typescript-mode)
(flycheck-add-mode 'javascript-eslint 'typescript-tsx-mode)
(flycheck-add-mode 'typescript-tslint 'typescript-tsx-mode)
(unless (modulep! +lsp)
(after! tide
(flycheck-add-next-checker 'typescript-tide '(warning . javascript-eslint) 'append)
(flycheck-add-mode 'typescript-tide 'typescript-tsx-mode)))
(add-hook! 'typescript-tsx-mode-hook
(defun +javascript-disable-tide-checkers-h ()
(pushnew! flycheck-disabled-checkers
'javascript-jshint
'tsx-tide
'jsx-tide)))))
:config :config
(when (fboundp 'web-mode) (+javascript-common-config 'typescript-mode))
(define-derived-mode typescript-tsx-mode web-mode "TypeScript-TSX")
(when (modulep! +lsp)
(after! lsp-mode
(add-to-list 'lsp--formatting-indent-alist '(typescript-tsx-mode . typescript-indent-level))))
(when (modulep! +tree-sitter)
(after! evil-textobj-tree-sitter
(pushnew! evil-textobj-tree-sitter-major-mode-language-alist '(typescript-tsx-mode . "tsx")))
(after! tree-sitter
(pushnew! tree-sitter-major-mode-language-alist '(typescript-tsx-mode . tsx)))
;; HACK: the tsx grammer doesn't work with the hightlighting provided by
;; font-lock-keywords. See emacs-tree-sitter/tree-sitter-langs#23
(setq-hook! 'typescript-tsx-mode-hook
tree-sitter-hl-use-font-lock-keywords nil)))
(set-docsets! '(typescript-mode typescript-tsx-mode)
:add "TypeScript" "AngularTS")
(set-electric! '(typescript-mode typescript-tsx-mode)
:chars '(?\} ?\))
:words '("||" "&&"))
;; HACK Fixes comment continuation on newline
(autoload 'js2-line-break "js2-mode" nil t)
(setq-hook! 'typescript-mode-hook
comment-line-break-function #'js2-line-break
;; Most projects use either eslint, prettier, .editorconfig, or tsf in order (use-package! typescript-ts-mode ; 29.1+ only
;; to specify indent level and formatting. In the event that no :when (modulep! +tree-sitter)
;; project-level config is specified (very rarely these days), the community :mode "\\.ts\\'"
;; default is 2, not 4. However, respect what is in tsfmt.json if it is :init
;; present in the project (set-tree-sitter! 'typescript-mode 'typescript-ts-mode
typescript-indent-level '((typescript :url "https://github.com/tree-sitter/tree-sitter-typescript"
(or (and (bound-and-true-p tide-mode) :commit "8e13e1db35b941fc57f2bd2dd4628180448c17d5"
(plist-get (tide-tsfmt-options) :indentSize)) :source-dir "typescript/src")))
typescript-indent-level) :config
(+javascript-common-config 'typescript-ts-mode))
;; Fix #5556: expand .x to className="x" instead of class="x", if
;; `emmet-mode' is used. (use-package! tsx-ts-mode
emmet-expand-jsx-className? t)) :when (modulep! +tree-sitter)
:when (fboundp 'tsx-ts-mode) ; 29.1+ only
:mode "\\.[tj]sx\\'"
:defer t
:config
(+javascript-common-config 'tsx-ts-mode))
;; ;;
;;; Tools ;;; Extensions
(when (modulep! +tree-sitter) ;; Parse node stack traces in the compilation buffer
(add-hook! '(js2-mode-local-vars-hook (after! compilation
typescript-mode-local-vars-hook (add-to-list 'compilation-error-regexp-alist 'node)
typescript-tsx-mode-local-vars-hook (add-to-list 'compilation-error-regexp-alist-alist
rjsx-mode-local-vars-hook) '(node "^[[:blank:]]*at \\(.*(\\|\\)\\(.+?\\):\\([[:digit:]]+\\):\\([[:digit:]]+\\)"
:append #'tree-sitter!)) 2 3 4)))
(add-hook! '(typescript-mode-local-vars-hook
typescript-tsx-mode-local-vars-hook
web-mode-local-vars-hook
rjsx-mode-local-vars-hook)
(defun +javascript-init-lsp-or-tide-maybe-h ()
"Start `lsp' or `tide' in the current buffer.
LSP will be used if the +lsp flag is enabled for :lang javascript AND if the
current buffer represents a file in a project.
If LSP fails to start (e.g. no available server or project), then we fall back
to tide."
(let ((buffer-file-name (buffer-file-name (buffer-base-buffer))))
(when (derived-mode-p 'js-mode 'typescript-mode 'typescript-tsx-mode)
(if (null buffer-file-name)
;; necessary because `tide-setup' and `lsp' will error if not a
;; file-visiting buffer
(add-hook 'after-save-hook #'+javascript-init-lsp-or-tide-maybe-h
nil 'local)
(or (if (modulep! +lsp) (lsp!))
;; fall back to tide
(if (executable-find "node")
(and (require 'tide nil t)
(progn (tide-setup) tide-mode))
(ignore
(doom-log "Couldn't start tide because 'node' is missing"))))
(remove-hook 'after-save-hook #'+javascript-init-lsp-or-tide-maybe-h
'local))))))
(use-package! tide (use-package! nodejs-repl
:hook (tide-mode . tide-hl-identifier-mode) :defer t
:config
(set-company-backend! 'tide-mode 'company-tide)
;; navigation
(set-lookup-handlers! 'tide-mode :async t
:xref-backend #'xref-tide-xref-backend
:documentation #'tide-documentation-at-point)
(set-popup-rule! "^\\*tide-documentation" :quit t)
(setq tide-completion-detailed t
tide-always-show-documentation t
;; Fix #1792: by default, tide ignores payloads larger than 100kb. This
;; is too small for larger projects that produce long completion lists,
;; so we up it to 512kb.
tide-server-max-response-length 524288
;; We'll handle it
tide-completion-setup-company-backend nil)
;; Resolve to `doom-project-root' if `tide-project-root' fails
(advice-add #'tide-project-root :override #'+javascript-tide-project-root-a)
;; Cleanup tsserver when no tide buffers are left
(add-hook! 'tide-mode-hook
(add-hook 'kill-buffer-hook #'+javascript-cleanup-tide-processes-h
nil 'local))
;; Eldoc is activated too soon and disables itself, thinking there is no eldoc
;; support in the current buffer, so we must re-enable it later once eldoc
;; support exists. It is set *after* tide-mode is enabled, so enabling it on
;; `tide-mode-hook' is too early, so...
(advice-add #'tide-setup :after #'eldoc-mode)
(map! :localleader
:map tide-mode-map
"R" #'tide-restart-server
"f" #'tide-format
"rrs" #'tide-rename-symbol
"roi" #'tide-organize-imports))
(use-package! js2-refactor
:hook ((js2-mode rjsx-mode) . js2-refactor-mode)
:init :init
(map! :after js2-mode
:map js2-mode-map
:localleader
(:prefix ("r" . "refactor")
(:prefix ("a" . "add/arguments"))
(:prefix ("b" . "barf"))
(:prefix ("c" . "contract"))
(:prefix ("d" . "debug"))
(:prefix ("e" . "expand/extract"))
(:prefix ("i" . "inject/inline/introduce"))
(:prefix ("l" . "localize/log"))
(:prefix ("o" . "organize"))
(:prefix ("r" . "rename"))
(:prefix ("s" . "slurp/split/string"))
(:prefix ("t" . "toggle"))
(:prefix ("u" . "unwrap"))
(:prefix ("v" . "var"))
(:prefix ("w" . "wrap"))
(:prefix ("3" . "ternary"))))
:config :config
(when (modulep! :editor evil +everywhere) (+javascript-common-config 'nodejs-repl-mode))
(add-hook 'js2-refactor-mode-hook #'evil-normalize-keymaps)
(let ((js2-refactor-mode-map (evil-get-auxiliary-keymap js2-refactor-mode-map 'normal t t)))
(js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key)))))
;;;###package skewer-mode
(map! :localleader
(:after js2-mode
:map js2-mode-map
"S" #'+javascript/skewer-this-buffer
:prefix ("s" . "skewer"))
:prefix "s"
(:after skewer-mode
:map skewer-mode-map
"E" #'skewer-eval-last-expression
"e" #'skewer-eval-defun
"f" #'skewer-load-buffer)
(:after skewer-css
:map skewer-css-mode-map
"e" #'skewer-css-eval-current-declaration
"r" #'skewer-css-eval-current-rule
"b" #'skewer-css-eval-buffer
"c" #'skewer-css-clear-all)
(:after skewer-html
:map skewer-html-mode-map
"e" #'skewer-html-eval-tag))
(use-package! npm-mode
:hook ((js-mode typescript-mode) . npm-mode)
:config
(map! :localleader
(:map npm-mode-keymap
"n" npm-mode-command-keymap)
(:after js2-mode
:map js2-mode-map
:prefix ("n" . "npm"))))
;; ;;

View File

@@ -8,3 +8,7 @@
(assert! (or (not (modulep! +tree-sitter)) (assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(unless (modulep! +tree-sitter)
(warn! "Typescript support is degraded without +tree-sitter (and Emacs 29+)")
(warn! "No JSX/TSX support without +tree-sitter (and Emacs 29+)"))

View File

@@ -2,18 +2,10 @@
;;; lang/javascript/packages.el ;;; lang/javascript/packages.el
;; Major modes ;; Major modes
(package! rjsx-mode :pin "b697fe4d92cc84fa99a7bcb476f815935ea0d919") (unless (or (modulep! +tree-sitter)
(package! typescript-mode :pin "481df3ad2cdf569d8e6697679669ff6206fbd2f9") (fboundp 'treesit-available-p)
(treesit-available-p))
(package! typescript-mode :pin "481df3ad2cdf569d8e6697679669ff6206fbd2f9"))
;; Tools ;; Extensions
(package! js2-refactor :pin "e1177c728ae52a5e67157fb18ee1409d8e95386a")
(package! npm-mode :pin "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb")
;; Eval
(package! nodejs-repl :pin "130d49b073a50b7aad472ae8cd05848a9840e480") (package! nodejs-repl :pin "130d49b073a50b7aad472ae8cd05848a9840e480")
(package! skewer-mode :pin "e5bed351939c92a1f788f78398583c2f83f1bb3c")
;; Programming environment
(package! tide :pin "6a35fe355f1442da34b976bf2decf008d6e4f991")
(when (modulep! :tools lookup)
(package! xref-js2 :pin "e215af9eedac69b40942fff9d5514704f9f4d43e"))

View File

@@ -15,7 +15,7 @@ This module adds [[https://www.json.org/json-en.html][JSON]] support to Doom Ema
(supports [[https://github.com/vscode-langservers/vscode-json-languageserver][vscode-json-languageserver]]). (supports [[https://github.com/vscode-langservers/vscode-json-languageserver][vscode-json-languageserver]]).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires Emacs 29.1+ and [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:counsel-jq]] if [[doom-module::completion ivy]] - [[doom-package:counsel-jq]] if [[doom-module::completion ivy]]

View File

@@ -2,16 +2,12 @@
(use-package! json-mode (use-package! json-mode
:mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'" :mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'"
:init
(when (modulep! +lsp)
(add-hook 'json-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook! '(json-mode-local-vars-hook
jsonc-mode-local-vars-hook)
:append #'tree-sitter!))
:config :config
(set-electric! 'json-mode :chars '(?\n ?: ?{ ?})) (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))
(when (modulep! +lsp)
(add-hook 'json-mode-local-vars-hook #'lsp! 'append))
(map! :after json-mode (map! :after json-mode
:map json-mode-map :map json-mode-map
:localleader :localleader
@@ -24,6 +20,17 @@
"f" #'json-mode-beautify)) "f" #'json-mode-beautify))
(use-package! json-ts-mode ; 29.1+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'json-mode 'json-ts-mode
'((json :url "https://github.com/tree-sitter/tree-sitter-json"
:commit "4d770d31f732d50d3ec373865822fbe659e47c75")))
:config
(when (modulep! +lsp)
(add-hook 'json-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! counsel-jq (use-package! counsel-jq
:when (modulep! :completion ivy) :when (modulep! :completion ivy)

View File

@@ -15,8 +15,8 @@ This module adds support for [[https://julialang.org/][the Julia language]] to D
** Module flags ** Module flags
- +lsp :: - +lsp ::
Enable LSP support for ~julia-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~julia-mode~. Requires [[doom-module::tools lsp]] and a
(supports LanguageServer.jl). langserver (supports LanguageServer.jl).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires [[doom-module::tools tree-sitter]].

View File

@@ -4,14 +4,11 @@
:interpreter "julia" :interpreter "julia"
:config :config
(unless (modulep! +snail) (unless (modulep! +snail)
(set-repl-handler! 'julia-mode #'+julia/open-repl)) (set-repl-handler! '(julia-mode julia-ts-mode) #'+julia/open-repl))
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'julia-mode-local-vars-hook #'lsp! 'append)) (add-hook 'julia-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'julia-mode-local-vars-hook #'tree-sitter! 'append))
;; Borrow matlab.el's fontification of math operators. From ;; Borrow matlab.el's fontification of math operators. From
;; <https://web.archive.org/web/20170326183805/https://ogbe.net/emacsconfig.html> ;; <https://web.archive.org/web/20170326183805/https://ogbe.net/emacsconfig.html>
(dolist (mode '(julia-mode ess-julia-mode)) (dolist (mode '(julia-mode ess-julia-mode))
@@ -47,9 +44,21 @@
1 font-lock-type-face))))) 1 font-lock-type-face)))))
(use-package! julia-ts-mode
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'julia-mode 'julia-ts-mode
'((julia :url "https://github.com/tree-sitter/tree-sitter-julia")))
:config
(when (modulep! +lsp)
(add-hook 'julia-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! julia-repl (use-package! julia-repl
:preface (defvar +julia-repl-start-hook nil) :preface (defvar +julia-repl-start-hook nil)
:hook (julia-mode . julia-repl-mode) :hook (julia-mode . julia-repl-mode)
:hook (julia-ts-mode . julia-repl-mode)
:hook (+julia-repl-start . +julia-override-repl-escape-char-h) :hook (+julia-repl-start . +julia-override-repl-escape-char-h)
:hook (+julia-repl-start . julia-repl-use-emacsclient) :hook (+julia-repl-start . julia-repl-use-emacsclient)
:config :config
@@ -95,7 +104,8 @@
:after eglot :after eglot
:init :init
;; Prevent timeout while installing LanguageServer.jl ;; Prevent timeout while installing LanguageServer.jl
(setq-hook! 'julia-mode-hook eglot-connect-timeout (max eglot-connect-timeout 60)) (setq-hook! '(julia-mode-hook julia-ts-mode-hook)
eglot-connect-timeout (max eglot-connect-timeout 60))
:config (eglot-jl-init)) :config (eglot-jl-init))
@@ -103,6 +113,7 @@
:when (modulep! +snail) :when (modulep! +snail)
:when (modulep! :term vterm) :when (modulep! :term vterm)
:hook (julia-mode . julia-snail-mode) :hook (julia-mode . julia-snail-mode)
:hook (julia-ts-mode . julia-snail-mode)
:config :config
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil :select nil :quit nil) (set-popup-rule! "^\\*julia.*\\*$" :ttl nil :select nil :quit nil)

View File

@@ -4,6 +4,9 @@
(package! julia-mode :pin "5c940c4ba357d8361534f11169f3d40b2d7833fc") (package! julia-mode :pin "5c940c4ba357d8361534f11169f3d40b2d7833fc")
(package! julia-repl :pin "317d56021889a336b4be241604ba71e46dc80581") (package! julia-repl :pin "317d56021889a336b4be241604ba71e46dc80581")
(when (modulep! +tree-sitter)
(package! julia-ts-mode :pin "d693c6b35d3aed986b2700a3b5f910de12d6c53c"))
(when (modulep! +lsp) (when (modulep! +lsp)
(if (modulep! :tools lsp +eglot) (if (modulep! :tools lsp +eglot)
(package! eglot-jl :pin "7c968cc61fb64016ebe6dc8ff83fd05923db4374") (package! eglot-jl :pin "7c968cc61fb64016ebe6dc8ff83fd05923db4374")

View File

@@ -13,10 +13,14 @@ This module adds [[https://kotlinlang.org/][Kotlin]] support to Doom Emacs.
- +lsp :: - +lsp ::
Enable LSP support for ~kotlin-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~kotlin-mode~. Requires [[doom-module::tools lsp]] and a langserver
(supports [[https://github.com/emacs-lsp/lsp-mode][kotlin-language-server]]). (supports [[https://github.com/emacs-lsp/lsp-mode][kotlin-language-server]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires Emacs 29.1+ and [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:flycheck-kotlin]] if [[doom-module::checkers syntax]] - [[doom-package:flycheck-kotlin]] if [[doom-module::checkers syntax]]
- [[doom-package:kotlin-mode]] - [[doom-package:kotlin-mode]]
- [[doom-package:kotlin-ts-mode]]
** Hacks ** Hacks
/No hacks documented for this module./ /No hacks documented for this module./

View File

@@ -1,11 +1,12 @@
;;; lang/kotlin/config.el -*- lexical-binding: t; -*- ;;; lang/kotlin/config.el -*- lexical-binding: t; -*-
(after! kotlin-mode (after! kotlin-mode
(when (modulep! +lsp)
(add-hook 'kotlin-mode-local-vars-hook #'lsp! 'append))
(set-docsets! 'kotlin-mode "Kotlin") (set-docsets! 'kotlin-mode "Kotlin")
(set-repl-handler! 'kotlin-mode #'kotlin-repl) (set-repl-handler! 'kotlin-mode #'kotlin-repl)
(when (modulep! +lsp)
(add-hook 'kotlin-mode-local-vars-hook #'lsp! 'append))
(map! :map kotlin-mode-map (map! :map kotlin-mode-map
:localleader :localleader
:prefix ("b" . "build") :prefix ("b" . "build")
@@ -17,3 +18,15 @@
(use-package! flycheck-kotlin (use-package! flycheck-kotlin
:when (modulep! :checkers syntax -flymake) :when (modulep! :checkers syntax -flymake)
:hook (kotlin-mode . flycheck-kotlin-setup)) :hook (kotlin-mode . flycheck-kotlin-setup))
(use-package! kotlin-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'kotlin-mode 'kotlin-ts-mode
'((kotlin :url "https://github.com/fwcd/tree-sitter-kotlin")))
:config
(when (modulep! +lsp)
(add-hook 'kotlin-ts-mode-local-vars-hook #'lsp! 'append)))

View File

@@ -3,5 +3,9 @@
(package! kotlin-mode :pin "fddd747e5b4736e8b27a147960f369b86179ddff") (package! kotlin-mode :pin "fddd747e5b4736e8b27a147960f369b86179ddff")
(when (and (modulep! +tree-sitter)
(fboundp 'treesit-available-p))
(package! kotlin-ts-mode :pin "a25d56cecac9160ba7c140f982ec16ca7b2fe97f"))
(when (modulep! :checkers syntax -flymake) (when (modulep! :checkers syntax -flymake)
(package! flycheck-kotlin :pin "a2a6abb9a7f85c6fb15ce327459ec3c8ff780188")) (package! flycheck-kotlin :pin "a2a6abb9a7f85c6fb15ce327459ec3c8ff780188"))

View File

@@ -24,8 +24,8 @@ This module adds Lua support to Doom Emacs.
(supports EmmyLua, lua-language-server, and lua-lsp). (supports EmmyLua, lua-language-server, and lua-lsp).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. Has support for both Lua and editing. Requires Emacs 30.1+ and [[doom-module::tools tree-sitter]]. Only
Fennel. supports Lua at the moment.
- +moonscript :: - +moonscript ::
Enable support for the Moonscript language. Enable support for the Moonscript language.

View File

@@ -1,5 +1,26 @@
;;; lang/lua/autoload/lua.el -*- lexical-binding: t; -*- ;;; lang/lua/autoload/lua.el -*- lexical-binding: t; -*-
;;;###autoload
(defvar +lua-lsp-dir (concat doom-data-dir "lsp/lua-language-server/")
"Absolute path to the directory of sumneko's lua-language-server.
This directory MUST contain the 'main.lua' file and be the in-source build of
lua-language-server.")
;;;###autoload
(defun +lua-generate-lsp-server-command ()
;; The absolute path to lua-language-server binary is necessary because the
;; bundled dependencies aren't found otherwise. The only reason this is a
;; function is to dynamically change when/if `+lua-lsp-dir' does
(list (or (executable-find "lua-language-server")
(doom-path +lua-lsp-dir
(cond ((featurep :system 'macos) "bin/macOS")
((featurep :system 'linux) "bin/Linux")
((featurep :system 'windows) "bin/Windows"))
"lua-language-server"))
"-E" "-e" "LANG=en"
(doom-path +lua-lsp-dir "main.lua")))
(defun +lua-love-build-command () (defun +lua-love-build-command ()
(when-let (root (+lua-love-project-root)) (when-let (root (+lua-love-project-root))
(format "%s %s" (format "%s %s"

View File

@@ -7,44 +7,34 @@
;; ;;
;;; Major modes ;;; Major modes
(defun +lua-common-config (mode)
(set-lookup-handlers! mode :documentation 'lua-search-documentation)
(set-electric! mode :words '("else" "end"))
(set-repl-handler! mode #'+lua/open-repl)
(set-company-backend! mode '(company-lua company-yasnippet))
(when (modulep! +lsp)
(add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)
(when (modulep! :tools lsp +eglot)
(set-eglot-client! mode (+lua-generate-lsp-server-command)))))
(use-package! lua-mode (use-package! lua-mode
:interpreter "\\<lua\\(?:jit\\)?"
:init
(setq lua-indent-level 2) ; default is 3; madness!
:config
(+lua-common-config 'lua-mode))
(use-package! lua-ts-mode
:when (modulep! +tree-sitter)
:defer t :defer t
:init :init
;; lua-indent-level defaults to 3 otherwise. Madness. (set-tree-sitter! 'lua-mode 'lua-ts-mode
(setq lua-indent-level 2) '((lua :url "https://github.com/tree-sitter-grammars/tree-sitter-lua"
:commit "db16e76558122e834ee214c8dc755b4a3edc82a9")))
:config :config
(set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (+lua-common-config 'lua-ts-mode))
(set-electric! 'lua-mode :words '("else" "end"))
(set-repl-handler! 'lua-mode #'+lua/open-repl)
(set-company-backend! 'lua-mode '(company-lua company-yasnippet))
(when (modulep! +lsp)
(add-hook 'lua-mode-local-vars-hook #'lsp! 'append)
(when (modulep! :tools lsp +eglot)
(defvar +lua-lsp-dir (concat doom-data-dir "lsp/lua-language-server/")
"Absolute path to the directory of sumneko's lua-language-server.
This directory MUST contain the 'main.lua' file and be the in-source build of
lua-language-server.")
(defun +lua-generate-lsp-server-command ()
;; The absolute path to lua-language-server binary is necessary because
;; the bundled dependencies aren't found otherwise. The only reason this
;; is a function is to dynamically change when/if `+lua-lsp-dir' does
(list (or (executable-find "lua-language-server")
(doom-path +lua-lsp-dir
(cond ((featurep :system 'macos) "bin/macOS")
((featurep :system 'linux) "bin/Linux")
((featurep :system 'windows) "bin/Windows"))
"lua-language-server"))
"-E" "-e" "LANG=en"
(doom-path +lua-lsp-dir "main.lua")))
(set-eglot-client! 'lua-mode (+lua-generate-lsp-server-command)))
(when (modulep! +tree-sitter)
(add-hook 'lua-mode-local-vars-hook #'tree-sitter! 'append))))
(use-package! moonscript (use-package! moonscript
@@ -60,6 +50,7 @@ lua-language-server.")
(require 'flycheck-moonscript nil t))) (require 'flycheck-moonscript nil t)))
;; TODO: fennel-ts-mode
(use-package! fennel-mode (use-package! fennel-mode
:when (modulep! +fennel) :when (modulep! +fennel)
:mode "\\.fenneldoc\\'" :mode "\\.fenneldoc\\'"
@@ -74,17 +65,14 @@ lua-language-server.")
tab-width 2 tab-width 2
;; Don't treat autoloads or sexp openers as outline headers, we have ;; Don't treat autoloads or sexp openers as outline headers, we have
;; hideshow for that. ;; hideshow for that.
outline-regexp "[ \t]*;;;;* [^ \t\n]") outline-regexp "[ \t]*;;;;* [^ \t\n]"))
(when (modulep! +tree-sitter)
(add-hook! 'fennel-mode-local-vars-hook 'tree-sitter! 'append)))
;; ;;
;;; Frameworks ;;; Frameworks
(def-project-mode! +lua-love-mode (def-project-mode! +lua-love-mode
:modes '(moonscript-mode lua-mode markdown-mode json-mode) :modes '(moonscript-mode lua-mode lua-ts-mode markdown-mode json-mode)
:when (+lua-love-project-root) :when (+lua-love-project-root)
:on-load :on-load
(progn (progn

View File

@@ -0,0 +1,13 @@
;;; lang/lua/doctor.el -*- lexical-binding: t; -*-
(assert! (or (not (modulep! +lsp))
(modulep! :tools lsp))
"This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'lua-ts-mode))
"Can't find `lua-ts-mode'; Emacs 30.1+ is required")

View File

@@ -33,11 +33,16 @@ for Markdown's syntax is the format of plain text email. -- John Gruber
- +grip :: - +grip ::
Enable [[https://github.com/seagle0128/grip-mode][grip support]] (on [[kbd:][<localleader> p]]), to provide live github-style Enable [[https://github.com/seagle0128/grip-mode][grip support]] (on [[kbd:][<localleader> p]]), to provide live github-style
previews of your markdown (or org) files. previews of your markdown (or org) files.
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. Note that tree-sitter
support on Emacs 31 is superior to 30 and under.
** Packages ** Packages
- [[doom-package:edit-indirect]] - [[doom-package:edit-indirect]]
- [[doom-package:evil-markdown]] if [[doom-module::editor evil +everywhere]] - [[doom-package:evil-markdown]] if [[doom-module::editor evil +everywhere]]
- [[doom-package:grip-mode]] if [[doom-module:+grip]] - [[doom-package:grip-mode]] if [[doom-module:+grip]]
- [[doom-package:markdown-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:markdown-mode]] - [[doom-package:markdown-mode]]
- [[doom-package:markdown-toc]] - [[doom-package:markdown-toc]]

View File

@@ -130,6 +130,13 @@ capture, the end position, and the output buffer.")
:desc "GFM checkbox" "x" #'markdown-toggle-gfm-checkbox))) :desc "GFM checkbox" "x" #'markdown-toggle-gfm-checkbox)))
(use-package! markdown-ts-mode ; 31+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'markdown-mode 'markdown-ts-mode '(markdown markdown-inline)))
(use-package! evil-markdown (use-package! evil-markdown
:when (modulep! :editor evil +everywhere) :when (modulep! :editor evil +everywhere)
:hook (markdown-mode . evil-markdown-mode) :hook (markdown-mode . evil-markdown-mode)

View File

@@ -1,6 +1,10 @@
;; -*- lexical-binding: t; no-byte-compile: t; -*- ;; -*- lexical-binding: t; no-byte-compile: t; -*-
;;; lang/markdown/doctor.el ;;; lang/markdown/doctor.el
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(when (require 'markdown-mode nil t) (when (require 'markdown-mode nil t)
(cond ((eq markdown-command #'+markdown-compile) (cond ((eq markdown-command #'+markdown-compile)
(unless (cl-loop for (exe . cmd) in (list (cons "marked" '+markdown-compile-marked) (unless (cl-loop for (exe . cmd) in (list (cons "marked" '+markdown-compile-marked)

View File

@@ -8,6 +8,11 @@
;; present when you call `markdown-edit-code-block'. ;; present when you call `markdown-edit-code-block'.
(package! edit-indirect :pin "82a28d8a85277cfe453af464603ea330eae41c05") (package! edit-indirect :pin "82a28d8a85277cfe453af464603ea330eae41c05")
(when (modulep! +tree-sitter)
(package! markdown-ts-mode
:built-in 'prefer ; Emacs 31+ has a superior markdown-ts-mode
:pin "2f1ee8b94cdf53cebc31ae08ecfbba846193d5e1"))
(when (modulep! +grip) (when (modulep! +grip)
(package! grip-mode :pin "11fecd5b38c78597ff53a39fb3a090e7c80350fa")) (package! grip-mode :pin "11fecd5b38c78597ff53a39fb3a090e7c80350fa"))

View File

@@ -19,20 +19,18 @@ Includes:
[[doom-contrib-maintainer:][Become a maintainer?]] [[doom-contrib-maintainer:][Become a maintainer?]]
** Module flags ** Module flags
- +lsp ::
Enable an LSP hook for ~nix-mode~. Requires [[doom-module::tools lsp]] and a
language server (one of either ~nil~ or ~rnix-lsp~).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires Emacs 29.1+ and [[doom-module::tools tree-sitter]].
- +lsp ::
Enable an LSP hook for ~nix-mode~. Requires [[doom-module::tools lsp]] and a language
server (one of either ~nil~ or ~rnix-lsp~).
You can still start a nix lsp manually without this flag, this just adds
a hook to always start the lsp when loading ~nix-mode~.
** Packages ** Packages
- [[doom-package:company-nixos-options]] if [[doom-module::completion company]] - [[doom-package:company-nixos-options]] if [[doom-module::completion company]]
- [[doom-package:helm-nixos-options]] if [[doom-module::completion helm]] - [[doom-package:helm-nixos-options]] if [[doom-module::completion helm]]
- [[doom-package:nix-mode]] - [[doom-package:nix-mode]]
- [[doom-package:nix-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:nix-update]] - [[doom-package:nix-update]]
** Hacks ** Hacks

View File

@@ -7,33 +7,25 @@
;; ;;
;;; Plugins ;;; Plugins
(use-package! nix-mode (add-to-list 'auto-mode-alist
:interpreter ("\\(?:cached-\\)?nix-shell" . +nix-shell-init-mode) (cons "/flake\\.lock\\'"
:mode "\\.nix\\'" (if (modulep! :lang json)
:init 'json-mode
(add-to-list 'auto-mode-alist 'js-mode)))
(cons "/flake\\.lock\\'"
(if (modulep! :lang json)
'json-mode (defun +nix-common-config (mode)
'js-mode))) (set-repl-handler! mode #'+nix/open-repl)
:config (set-company-backend! mode 'company-nixos-options)
(set-repl-handler! 'nix-mode #'+nix/open-repl) (set-lookup-handlers! mode
(set-company-backend! 'nix-mode 'company-nixos-options)
(set-lookup-handlers! 'nix-mode
:documentation '(+nix/lookup-option :async t)) :documentation '(+nix/lookup-option :async t))
(set-popup-rule! "^\\*nixos-options-doc\\*$" :ttl 0 :quit t) (set-popup-rule! "^\\*nixos-options-doc\\*$" :ttl 0 :quit t)
;; Fix #3927: disable idle completion because `company-nixos-options' is
;; dreadfully slow. It can still be invoked manually..
(setq-hook! 'nix-mode-hook company-idle-delay nil)
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'nix-mode-local-vars-hook #'lsp! 'append)) (add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'nix-mode-local-vars-hook #'tree-sitter! 'append))
(map! :localleader (map! :localleader
:map nix-mode-map :map ,(intern (format "%s-map" mode))
"f" #'nix-update-fetch "f" #'nix-update-fetch
"p" #'nix-format-buffer "p" #'nix-format-buffer
"r" #'nix-repl-show "r" #'nix-repl-show
@@ -43,6 +35,32 @@
"o" #'+nix/lookup-option)) "o" #'+nix/lookup-option))
(use-package! nix-mode
:interpreter ("\\(?:cached-\\)?nix-shell" . +nix-shell-init-mode)
:mode "\\.nix\\'"
:config
(+nix-common-config 'nix-mode))
(use-package! nix-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'nix-mode 'nix-ts-mode
'((nix :url "https://github.com/nix-community/tree-sitter-nix")))
:config
(+nix-common-config 'nix-ts-mode))
(use-package! company-nixos-options
:defer t
:init
;; Fix #3927: disable idle completion because `company-nixos-options' is
;; dreadfully slow. It can still be invoked manually..
(setq-hook! '(nix-mode-hook nix-ts-mode-hook) company-idle-delay nil))
(use-package! nix-update (use-package! nix-update
:commands nix-update-fetch) :commands nix-update-fetch)

View File

@@ -1,13 +1,13 @@
;; -*- lexical-binding: t; no-byte-compile: t; -*- ;; -*- lexical-binding: t; no-byte-compile: t; -*-
;;; lang/nix/doctor.el ;;; lang/nix/doctor.el
(assert! (or (modulep! -tree-sitter)
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(unless (executable-find "nix") (unless (executable-find "nix")
(warn! "Couldn't find the nix package manager. nix-mode won't work.")) (warn! "Couldn't find the nix package manager. nix-mode won't work."))
(when (require 'nix-mode nil t) (when (require 'nix-mode nil t)
(unless (executable-find nix-nixfmt-bin) (unless (executable-find nix-nixfmt-bin)
(warn! (concat "Couldn't find " nix-nixfmt-bin ". nix-format-buffer won't work.")))) (warn! (concat "Couldn't find " nix-nixfmt-bin ". nix-format-buffer won't work."))))
(assert! (or (modulep! -tree-sitter)
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")

View File

@@ -4,6 +4,10 @@
(package! nix-mode :pin "719feb7868fb567ecfe5578f6119892c771ac5e5") (package! nix-mode :pin "719feb7868fb567ecfe5578f6119892c771ac5e5")
(package! nix-update :pin "77022ccd918d665acbb519b243e7e3dc5eae1c47") (package! nix-update :pin "77022ccd918d665acbb519b243e7e3dc5eae1c47")
(when (and (modulep! +tree-sitter)
(fboundp 'treesit-available-p))
(package! nix-ts-mode :pin "62ce3a2dc39529c5db3516427e84b2c96b8efcfd"))
(when (modulep! :completion company) (when (modulep! :completion company)
(package! company-nixos-options :pin "053a2d5110ce05b7f99bcc2ac4804b70cbe87916")) (package! company-nixos-options :pin "053a2d5110ce05b7f99bcc2ac4804b70cbe87916"))

View File

@@ -23,9 +23,6 @@ This module adds [[https://ocaml.org/][OCaml]] support to Doom Emacs, powered by
- +lsp :: - +lsp ::
Enable LSP support for ~tuareg-mode~. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support for ~tuareg-mode~. Requires [[doom-module::tools lsp]] and a langserver
(supports [[https://github.com/freebroccolo/ocaml-language-server][ocaml-language-server]]). (supports [[https://github.com/freebroccolo/ocaml-language-server][ocaml-language-server]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:dune]] - [[doom-package:dune]]

View File

@@ -130,10 +130,6 @@
(opam-switch-set-switch (tuareg-opam-current-compiler))) (opam-switch-set-switch (tuareg-opam-current-compiler)))
(when (modulep! +tree-sitter)
(add-hook 'tuareg-mode-local-vars-hook #'tree-sitter!))
(use-package! dune (use-package! dune
:defer t :defer t
:config :config

View File

@@ -5,10 +5,6 @@
(modulep! :tools lsp)) (modulep! :tools lsp))
"This module requires (:tools lsp)") "This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(unless (executable-find "ocamlmerlin") (unless (executable-find "ocamlmerlin")
(warn! "Couldn't find ocamlmerlin. Lookup, completion and syntax checking won't work")) (warn! "Couldn't find ocamlmerlin. Lookup, completion and syntax checking won't work"))

View File

@@ -36,7 +36,7 @@ This module adds support for PHP 5.3+ (including PHP8) to Doom Emacs.
langserver (supports [[https://emacs-lsp.github.io/lsp-mode/page/lsp-phpactor/][phpactor]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-intelephense/][intelephense]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-serenata/][serenata]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-php/][php-language-server]]). langserver (supports [[https://emacs-lsp.github.io/lsp-mode/page/lsp-phpactor/][phpactor]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-intelephense/][intelephense]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-serenata/][serenata]], [[https://emacs-lsp.github.io/lsp-mode/page/lsp-php/][php-language-server]]).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires [[doom-module::tools tree-sitter]] and Emacs 30.1+.
** Packages ** Packages
- [[doom-package:async]] - [[doom-package:async]]

View File

@@ -17,17 +17,11 @@
;; ;;
;;; Packages ;;; Packages
(use-package! php-mode (defun +php-common-config (mode)
:mode "\\.inc\\'" (set-docsets! mode "PHP" "PHPUnit" "Laravel" "CakePHP" "CodeIgniter" "Doctrine_ORM")
:config (set-repl-handler! mode #'+php/open-repl)
;; Disable HTML compatibility in php-mode. `web-mode' has superior support for (set-lookup-handlers! mode :documentation #'php-search-documentation)
;; php+html. Use the .phtml extension instead. (set-ligatures! mode
(setq php-mode-template-compatibility nil)
(set-docsets! 'php-mode "PHP" "PHPUnit" "Laravel" "CakePHP" "CodeIgniter" "Doctrine_ORM")
(set-repl-handler! 'php-mode #'+php/open-repl)
(set-lookup-handlers! 'php-mode :documentation #'php-search-documentation)
(set-ligatures! 'php-mode
;; Functional ;; Functional
:lambda "function()" :lambda "fn" :lambda "function()" :lambda "fn"
:def "function" :def "function"
@@ -45,31 +39,61 @@
:return "return" :return "return"
:yield "use") :yield "use")
(when (modulep! +lsp) (let ((mode-vars-hook (intern (format "%s-local-vars-hook" mode)))
(when (executable-find "php-language-server.php") (mode-map (intern (format "%s-map" mode))))
(setq lsp-clients-php-server-command "php-language-server.php")) (sp-with-modes (ensure-list mode)
(add-hook 'php-mode-local-vars-hook #'lsp! 'append)) (sp-local-pair "<?" "?>" :post-handlers '(("| " "SPC" "=") ("||\n[i]" "RET") ("[d2]" "p")))
(sp-local-pair "<?php" "?>" :post-handlers '(("| " "SPC") ("||\n[i]" "RET"))))
(when (modulep! +tree-sitter) (if (modulep! -lsp)
(add-hook 'php-mode-local-vars-hook #'tree-sitter! 'append)) ;; `+php-company-backend' uses `php-extras-company' or
;; `company-dabbrev-code', in that order.
(when +php--company-backends
(set-company-backend! mode
(cons :separate +php--company-backends)
'company-dabbrev-code))
(when (executable-find "php-language-server.php")
(setq lsp-clients-php-server-command "php-language-server.php"))
(add-hook mode-vars-hook #'lsp! 'append))
;; Use the smallest `sp-max-pair-length' for optimum `smartparens' performance (map! :localleader
(setq-hook! 'php-mode-hook sp-max-pair-length 5) :map ,mode-map
:prefix ("t" . "test")
"r" #'phpunit-current-project
"a" #'phpunit-current-class
"s" #'phpunit-current-test)))
(sp-with-modes '(php-mode)
(sp-local-pair "<?" "?>" :post-handlers '(("| " "SPC" "=") ("||\n[i]" "RET") ("[d2]" "p")))
(sp-local-pair "<?php" "?>" :post-handlers '(("| " "SPC") ("||\n[i]" "RET"))))
(map! :localleader (use-package! php-mode
:map php-mode-map :hook (php-mode . rainbow-delimiters-mode)
:prefix ("t" . "test") :config
"r" #'phpunit-current-project (+php-common-config 'php-mode)
"a" #'phpunit-current-class
"s" #'phpunit-current-test)) ;; Disable HTML compatibility in php-mode. `web-mode' has superior support for
;; php+html. Use the .phtml extension instead.
(setq php-mode-template-compatibility nil))
(use-package! php-ts-mode
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'php-mode 'php-ts-mode
'((php :url "https://github.com/tree-sitter/tree-sitter-php"
:rev "v0.23.11"
:commit "f7cf7348737d8cff1b13407a0bfedce02ee7b046"
:source-dir "php/src")
(phpdoc :url "https://github.com/claytonrcarter/tree-sitter-phpdoc"
:commit "03bb10330704b0b371b044e937d5cc7cd40b4999")
html css ; requires :lang (web +tree-sitter)
javascript jsdoc)) ; requires :lang (javascript +tree-sitter)
:config
(+php-common-config 'php-ts-mode))
(use-package! php-refactor-mode (use-package! php-refactor-mode
:hook php-mode :hook php-mode
:hook php-ts-mode
:config :config
(map! :localleader (map! :localleader
:map php-refactor-mode-map :map php-refactor-mode-map
@@ -88,10 +112,9 @@
(use-package! composer (use-package! composer
:defer t :defer t
:init :init
(map! :after php-mode (setq composer-directory-to-managed-file (file-name-concat doom-etc-dir "composer/"))
:localleader (defvar +php-common-mode-map (make-sparse-keymap))
:map php-mode-map (map! :map +php-common-mode-map
:prefix ("c" . "composer")
"c" #'composer "c" #'composer
"i" #'composer-install "i" #'composer-install
"r" #'composer-require "r" #'composer-require
@@ -100,23 +123,29 @@
"s" #'composer-run-script "s" #'composer-run-script
"v" #'composer-run-vendor-bin-command "v" #'composer-run-vendor-bin-command
"o" #'composer-find-json-file "o" #'composer-find-json-file
"l" #'composer-view-lock-file)) "l" #'composer-view-lock-file)
(map! :after php-mode
:map php-mode-map
:desc "composer" "c" +php-common-mode-map)
(map! :after php-ts-mode
:map php-ts-mode-map
:desc "composer" "c" +php-common-mode-map))
;; ;;
;; Projects ;; Projects
(def-project-mode! +php-laravel-mode (def-project-mode! +php-laravel-mode
:modes '(php-mode yaml-mode web-mode nxml-mode js2-mode scss-mode) :modes '(php-mode php-ts-mode yaml-mode web-mode nxml-mode js2-mode scss-mode)
:files (and "artisan" "server.php")) :files (and "artisan" "server.php"))
(def-project-mode! +php-composer-mode (def-project-mode! +php-composer-mode
:modes '(web-mode php-mode) :modes '(web-mode php-mode php-ts-mode)
:files ("composer.json")) :files ("composer.json"))
(def-project-mode! +phpunit-docker-compose-mode (def-project-mode! +phpunit-docker-compose-mode
:when +php-run-tests-in-docker :when +php-run-tests-in-docker
:modes '(php-mode docker-compose-mode) :modes '(php-mode php-ts-mode docker-compose-mode)
:files (and "phpunit.xml" (or +php-default-docker-compose "docker-compose.yml")) :files (and "phpunit.xml" (or +php-default-docker-compose "docker-compose.yml"))
:on-enter :on-enter
(setq phpunit-args `("exec" ,+php-default-docker-container "php" "vendor/bin/phpunit") (setq phpunit-args `("exec" ,+php-default-docker-container "php" "vendor/bin/phpunit")

View File

@@ -5,9 +5,15 @@
(modulep! :tools lsp)) (modulep! :tools lsp))
"This module requires (:tools lsp)") "This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter)) (when (modulep! +tree-sitter)
(modulep! :tools tree-sitter)) (assert! (modulep! :tools tree-sitter)
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (fboundp 'php-ts-mode)
"Can't find `php-ts-mode'; Emacs 30.1+ is required")
(unless (modulep! :lang javascript +tree-sitter)
(error! "(:lang (javascript +tree-sitter)) required, but not enabled"))
(unless (modulep! :lang web +tree-sitter)
(error! "(:lang (web +tree-sitter)) required, but not enabled")))
(unless (executable-find "php") (unless (executable-find "php")
(warn! "Couldn't find php in your PATH")) (warn! "Couldn't find php in your PATH"))

View File

@@ -7,7 +7,7 @@
;;;###autoload ;;;###autoload
(defun +python-pyenv-mode-set-auto-h () (defun +python-pyenv-mode-set-auto-h ()
"Set pyenv-mode version from buffer-local variable." "Set pyenv-mode version from buffer-local variable."
(when (eq major-mode 'python-mode) (when (memq major-mode '(python-mode python-ts-mode))
(when (not (local-variable-p '+pyenv--version)) (when (not (local-variable-p '+pyenv--version))
(make-local-variable '+pyenv--version) (make-local-variable '+pyenv--version)
(setq +pyenv--version (+python-pyenv-read-version-from-file))) (setq +pyenv--version (+python-pyenv-read-version-from-file)))

View File

@@ -14,28 +14,39 @@
;;; Packages ;;; Packages
(use-package! python (use-package! python
:mode ("[./]flake8\\'" . conf-mode) :mode ("/\\(?:Pipfile\\|\\.?flake8\\)\\'" . conf-mode)
:mode ("/Pipfile\\'" . conf-mode)
:init :init
(setq python-environment-directory doom-cache-dir (setq python-environment-directory doom-cache-dir
python-indent-guess-indent-offset-verbose nil) python-indent-guess-indent-offset-verbose nil)
(when (modulep! +tree-sitter)
(set-tree-sitter! 'python-mode 'python-ts-mode
'((python :url "https://github.com/tree-sitter/tree-sitter-python"
:commit "bffb65a8cfe4e46290331dfef0dbf0ef3679de11"))))
:config
;; HACK: `python-base-mode' (and `python-ts-mode') don't exist on pre-29
;; versions of Emacs, Rather than litter this module with conditionals, I
;; shim the keymap in.
(unless (boundp 'python-base-mode-map)
(defvaralias 'python-base-mode-map 'python-mode-map))
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'python-mode-local-vars-hook #'lsp! 'append) (add-hook 'python-mode-local-vars-hook #'lsp! 'append)
(add-hook 'python-ts-mode-local-vars-hook #'lsp! 'append)
;; Use "mspyls" in eglot if in PATH ;; Use "mspyls" in eglot if in PATH
(when (executable-find "Microsoft.Python.LanguageServer") (when (executable-find "Microsoft.Python.LanguageServer")
(set-eglot-client! 'python-mode '("Microsoft.Python.LanguageServer")))) (set-eglot-client! '(python-mode python-ts-mode) '("Microsoft.Python.LanguageServer"))))
(when (modulep! +tree-sitter) (set-repl-handler! '(python-mode python-ts-mode) #'+python/open-repl
(add-hook 'python-mode-local-vars-hook #'tree-sitter! 'append))
:config
(set-repl-handler! 'python-mode #'+python/open-repl
:persist t :persist t
:send-region #'python-shell-send-region :send-region #'python-shell-send-region
:send-buffer #'python-shell-send-buffer) :send-buffer #'python-shell-send-buffer)
(set-docsets! '(python-mode inferior-python-mode) "Python 3" "NumPy" "SciPy" "Pandas")
(set-ligatures! 'python-mode (set-docsets! '(python-mode python-ts-mode inferior-python-mode)
"Python 3" "NumPy" "SciPy" "Pandas")
(set-ligatures! '(python-mode python-ts-mode)
;; Functional ;; Functional
:def "def" :def "def"
:lambda "lambda" :lambda "lambda"
@@ -62,7 +73,7 @@
(executable-find "python3")) (executable-find "python3"))
(setq python-shell-interpreter "python3")) (setq python-shell-interpreter "python3"))
(add-hook! 'python-mode-hook (add-hook! '(python-mode-hook python-ts-mode-hook)
(defun +python-use-correct-flycheck-executables-h () (defun +python-use-correct-flycheck-executables-h ()
"Use the correct Python executables for Flycheck." "Use the correct Python executables for Flycheck."
(let ((executable python-shell-interpreter)) (let ((executable python-shell-interpreter))
@@ -86,14 +97,16 @@
(advice-add #'pythonic-activate :after-while #'+modeline-update-env-in-all-windows-h) (advice-add #'pythonic-activate :after-while #'+modeline-update-env-in-all-windows-h)
(advice-add #'pythonic-deactivate :after #'+modeline-clear-env-in-all-windows-h)) (advice-add #'pythonic-deactivate :after #'+modeline-clear-env-in-all-windows-h))
(setq-hook! 'python-mode-hook tab-width python-indent-offset)) ;; HACK: `python-mode' doesn't update `tab-width' to reflect
;; `python-indent-offset', causing issues anywhere `tab-width' is respected.
(setq-hook! '(python-mode-hook python-ts-mode-hook) tab-width python-indent-offset))
(use-package! pyimport (use-package! pyimport
:defer t :defer t
:init :init
(map! :after python (map! :after python
:map python-mode-map :map python-base-mode-map
:localleader :localleader
:prefix ("i" . "imports") :prefix ("i" . "imports")
:desc "Insert missing imports" "i" #'pyimport-insert-missing :desc "Insert missing imports" "i" #'pyimport-insert-missing
@@ -105,12 +118,13 @@
:defer t :defer t
:init :init
(map! :after python (map! :after python
:map python-mode-map :map python-base-mode-map
:localleader :localleader
(:prefix ("i" . "imports") (:prefix ("i" . "imports")
:desc "Sort imports" "s" #'py-isort-buffer :desc "Sort imports" "s" #'py-isort-buffer
:desc "Sort region" "r" #'py-isort-region))) :desc "Sort region" "r" #'py-isort-region)))
(use-package! nose (use-package! nose
:commands nose-mode :commands nose-mode
:preface (defvar nose-mode-map (make-sparse-keymap)) :preface (defvar nose-mode-map (make-sparse-keymap))
@@ -138,7 +152,7 @@
:init :init
(map! :after python (map! :after python
:localleader :localleader
:map python-mode-map :map python-base-mode-map
:prefix ("t" . "test") :prefix ("t" . "test")
"a" #'python-pytest "a" #'python-pytest
"f" #'python-pytest-file-dwim "f" #'python-pytest-file-dwim
@@ -157,7 +171,7 @@
:hook (python-mode . pipenv-mode) :hook (python-mode . pipenv-mode)
:init (setq pipenv-with-projectile nil) :init (setq pipenv-with-projectile nil)
:config :config
(set-eval-handler! 'python-mode (set-eval-handler! '(python-mode python-ts-mode)
'((:command . (lambda () python-shell-interpreter)) '((:command . (lambda () python-shell-interpreter))
(:exec (lambda () (:exec (lambda ()
(if-let* ((bin (executable-find "pipenv" t)) (if-let* ((bin (executable-find "pipenv" t))
@@ -165,7 +179,7 @@
(format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin) (format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin)
"%c %o %s %a"))) "%c %o %s %a")))
(:description . "Run Python script"))) (:description . "Run Python script")))
(map! :map python-mode-map (map! :map python-base-mode-map
:localleader :localleader
:prefix ("e" . "pipenv") :prefix ("e" . "pipenv")
:desc "activate" "a" #'pipenv-activate :desc "activate" "a" #'pipenv-activate
@@ -185,7 +199,8 @@
(add-hook 'pyvenv-post-activate-hooks #'+modeline-update-env-in-all-windows-h) (add-hook 'pyvenv-post-activate-hooks #'+modeline-update-env-in-all-windows-h)
(add-hook 'pyvenv-pre-deactivate-hooks #'+modeline-clear-env-in-all-windows-h)) (add-hook 'pyvenv-pre-deactivate-hooks #'+modeline-clear-env-in-all-windows-h))
:config :config
(add-hook 'python-mode-local-vars-hook #'pyvenv-track-virtualenv) (add-hook! '(python-mode-local-vars-hook python-ts-mode-local-vars-hook)
#'pyvenv-track-virtualenv)
(add-to-list 'global-mode-string (add-to-list 'global-mode-string
'(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name " ")) '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name " "))
'append)) 'append))
@@ -199,7 +214,8 @@
(when (executable-find "pyenv") (when (executable-find "pyenv")
(pyenv-mode +1) (pyenv-mode +1)
(add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv")))) (add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv"))))
(add-hook 'python-mode-local-vars-hook #'+python-pyenv-mode-set-auto-h) (add-hook! '(python-mode-local-vars-hook python-ts-mode-local-vars-hook)
#'+python-pyenv-mode-set-auto-h)
(add-hook 'doom-switch-buffer-hook #'+python-pyenv-mode-set-auto-h)) (add-hook 'doom-switch-buffer-hook #'+python-pyenv-mode-set-auto-h))

View File

@@ -8,6 +8,10 @@
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'python-ts-mode))
"Can't find `python-ts-mode'; Emacs 29.1+ is required")
(if (not (or (executable-find "python") (if (not (or (executable-find "python")
(executable-find "python3"))) (executable-find "python3")))
(error! "Couldn't find python in your PATH") (error! "Couldn't find python in your PATH")

View File

@@ -13,10 +13,16 @@ This module provides language functionality for [[https://qt.io][Qt]] specific f
*This module needs a maintainer.* [[doom-contrib-maintainer:][Become a maintainer?]] *This module needs a maintainer.* [[doom-contrib-maintainer:][Become a maintainer?]]
** Module flags ** Module flags
/This module has no flags./ - +lsp ::
Enable LSP support for ~qml-mode~/~qml-ts-mode~. Requires [[doom-module::tools lsp]]
and a langserver (supports [[https://doc.qt.io/qt-6/qtqml-tooling-qmlls.html][qmlls]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:qml-mode]] - [[doom-package:qml-mode]]
- [[doom-package:qml-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:qt-pro-mode]] - [[doom-package:qt-pro-mode]]
** Hacks ** Hacks

View File

@@ -1,4 +0,0 @@
;;; lang/qt/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.pr[io]\\'" . qt-pro-mode))

27
modules/lang/qt/config.el Normal file
View File

@@ -0,0 +1,27 @@
;;; lang/qt/config.el -*- lexical-binding: t; -*-
(defun +qt-common-config (mode)
(when (modulep! +lsp)
(set-eglot-client! mode '("qmlls"))
(add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)))
(use-package! qml-mode
:defer t
:config
(+qt-common-config 'qml-mode))
(use-package! qml-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'qml-mode 'qml-ts-mode
'((qmljs :url "https://github.com/yuja/tree-sitter-qmljs")))
:config
(+qt-common-config 'qml-ts-mode))
(use-package! qt-pro-mode
:mode "\\.pr[io]\\'")

View File

@@ -0,0 +1,9 @@
;;; lang/qt/doctor.el -*- lexical-binding: t; -*-
(assert! (or (not (modulep! +lsp))
(modulep! :tools lsp))
"This module requires (:tools lsp)")
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")

View File

@@ -3,3 +3,9 @@
(package! qml-mode :pin "6c5f33ba88ae010bf201a80ee8095e20a724558c") (package! qml-mode :pin "6c5f33ba88ae010bf201a80ee8095e20a724558c")
(package! qt-pro-mode :pin "7a2da323de834294b413cbbb3c92f42f54913643") (package! qt-pro-mode :pin "7a2da323de834294b413cbbb3c92f42f54913643")
(when (modulep! +tree-sitter)
(package! qml-ts-mode
:recipe (:host github
:repo "xhcoding/qml-ts-mode")
:pin "b80c6663521b4d0083e416e6712ebc02d37b7aec"))

View File

@@ -22,9 +22,6 @@
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'ruby-mode-local-vars-hook #'lsp! 'append)) (add-hook 'ruby-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'ruby-mode-local-vars-hook #'tree-sitter! 'append))
(after! inf-ruby (after! inf-ruby
(add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h) (add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h)
;; switch to inf-ruby from compile if we detect a breakpoint has been hit ;; switch to inf-ruby from compile if we detect a breakpoint has been hit
@@ -39,6 +36,20 @@
"{" #'ruby-toggle-block)) "{" #'ruby-toggle-block))
(use-package! ruby-ts-mode ; 29.1+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'ruby-mode 'ruby-ts-mode
'((ruby :url "https://github.com/tree-sitter/tree-sitter-ruby"
:commit "71bd32fb7607035768799732addba884a37a6210")))
:config
(set-electric! 'ruby-ts-mode :words '("else" "end" "elsif"))
(set-repl-handler! 'ruby-ts-mode #'inf-ruby)
(when (modulep! +lsp)
(add-hook 'ruby-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! yard-mode (use-package! yard-mode
:hook ruby-mode) :hook ruby-mode)

View File

@@ -8,6 +8,10 @@
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'ruby-ts-mode))
"Can't find `ruby-ts-mode'; Emacs 29.1+ is required")
(unless (executable-find "ruby") (unless (executable-find "ruby")
(warn! "Ruby isn't installed.")) (warn! "Ruby isn't installed."))

View File

@@ -26,6 +26,7 @@ e.g. ~cargo~.
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:rust-mode]]
- [[doom-package:rustic]] - [[doom-package:rustic]]
** Hacks ** Hacks

View File

@@ -8,15 +8,50 @@
;; ;;
;;; Packages ;;; Packages
(use-package! rustic ;; HACK: `rust-mode' and `rustic' add entries to `auto-mode-alist', but package
;; load order makes which gets precedence unpredictable. By removing them
;; early, we rely on our own entries in `auto-mode-alist' and
;; `major-mode-remap-defaults' to ensure correct order.
(cl-callf2 rassq-delete-all 'rust-mode auto-mode-alist)
(cl-callf2 rassq-delete-all 'rustic-mode auto-mode-alist)
(use-package! rust-mode
:mode ("\\.rs\\'" . rust-mode) :mode ("\\.rs\\'" . rust-mode)
:mode ("\\.rs\\'" . rustic-mode) :defer t
:preface :preface
;; HACK: `rust-mode' and `rustic' add entries to `auto-mode-alist', but ;; Ensure rust-mode derives from rust-ts-mode, b/c rustic-mode derives from
;; package load order makes which gets precedence unpredictable. By removing ;; rust-mode. This way, rustic-mode is the only major mode we have to worry
;; them early, we rely on the `:mode' directives above to re-insert them ;; about.
;; with the correct order. (setq rust-mode-treesitter-derive (modulep! +tree-sitter))
(setq auto-mode-alist (assoc-delete-all "\\.rs\\'" auto-mode-alist))
:config
(setq rust-indent-method-chain t)
;; Load order is important for these two packages.
(let (auto-mode-alist)
(require 'rustic-mode nil t)))
(use-package! rust-ts-mode ; 29.1+ only
:when (modulep! +tree-sitter)
:defer t
:init
(set-tree-sitter! 'rust-mode 'rust-ts-mode
`((rust :url "https://github.com/tree-sitter/tree-sitter-rust"
:commit ,(if (and (treesit-available-p)
(< (treesit-library-abi-version) 15))
"1f63b33efee17e833e0ea29266dd3d713e27e321"
"18b0515fca567f5a10aee9978c6d2640e878671a"))))
(add-to-list 'major-mode-remap-defaults '(rust-mode . rust-ts-mode) t))
(use-package! rustic
:defer t
:preface
(unless (assq 'rust-mode major-mode-remap-defaults)
(add-to-list 'major-mode-remap-defaults '(rust-mode . rustic-mode)))
;; HACK `rustic' sets up some things too early. I'd rather disable it and let ;; HACK `rustic' sets up some things too early. I'd rather disable it and let
;; our respective modules standardize how they're initialized. ;; our respective modules standardize how they're initialized.
@@ -27,20 +62,20 @@
(remove-hook 'rustic-mode-hook #'flycheck-mode) (remove-hook 'rustic-mode-hook #'flycheck-mode)
(remove-hook 'rustic-mode-hook #'flymake-mode-off) (remove-hook 'rustic-mode-hook #'flymake-mode-off)
(remove-hook 'flycheck-mode-hook #'rustic-flycheck-setup)) (remove-hook 'flycheck-mode-hook #'rustic-flycheck-setup))
:init :init
;; HACK Certainly, `rustic-babel' does this, but the package (and many other ;; HACK Certainly, `rustic-babel' does this, but the package (and many other
;; rustic packages) must be loaded in order for them to take effect. To lazy ;; rustic packages) must be loaded in order for them to take effect. To lazy
;; load it all, we must do it early: ;; load it all, it must be done earlier:
(after! org-src (after! org-src
(defalias 'org-babel-execute:rust #'org-babel-execute:rustic) (defalias 'org-babel-execute:rust #'org-babel-execute:rustic)
(add-to-list 'org-src-lang-modes '("rust" . rustic))) (add-to-list 'org-src-lang-modes '("rust" . rustic)))
:config :config
(set-docsets! 'rustic-mode "Rust") (set-docsets! 'rustic-mode "Rust")
(set-popup-rule! "^\\*rustic-compilation" :vslot -1) (set-popup-rule! "^\\*rustic-compilation" :vslot -1)
(set-popup-rule! "^\\*cargo-run" :vslot -1) (set-popup-rule! "^\\*cargo-run" :vslot -1)
(setq rustic-indent-method-chain t)
;; Leave automatic reformatting to the :editor format module. ;; Leave automatic reformatting to the :editor format module.
(setq rustic-babel-format-src-block nil (setq rustic-babel-format-src-block nil
rustic-format-trigger nil) rustic-format-trigger nil)
@@ -59,7 +94,7 @@
;; response of Rust Analyzer, which is not stable enough for `lsp-mode' ;; response of Rust Analyzer, which is not stable enough for `lsp-mode'
;; maintainers (see emacs-lsp/lsp-mode#1740). ;; maintainers (see emacs-lsp/lsp-mode#1740).
(unless (modulep! :tools lsp +eglot) (unless (modulep! :tools lsp +eglot)
(defadvice! +rust--dont-cache-results-from-ra-a (fn &rest args) (defadvice! +rust--dont-cache-results-from-ra-a (&rest _)
:after #'lsp-eldoc-function :after #'lsp-eldoc-function
(when (derived-mode-p 'rust-mode 'rust-ts-mode) (when (derived-mode-p 'rust-mode 'rust-ts-mode)
(setq lsp--hover-saved-bounds nil))) (setq lsp--hover-saved-bounds nil)))
@@ -83,9 +118,6 @@
(s-join " ")))) (s-join " "))))
(lsp--render-element (concat "```rust\n" sig cmt "\n```")))))) (lsp--render-element (concat "```rust\n" sig cmt "\n```"))))))
(when (modulep! +tree-sitter)
(add-hook 'rustic-mode-local-vars-hook #'tree-sitter! 'append))
;; HACK If lsp/eglot isn't available, it attempts to install lsp-mode via ;; HACK If lsp/eglot isn't available, it attempts to install lsp-mode via
;; package.el. Doom manages its own dependencies through straight so disable ;; package.el. Doom manages its own dependencies through straight so disable
;; this behavior to avoid package-not-initialized errors. ;; this behavior to avoid package-not-initialized errors.
@@ -96,17 +128,17 @@
(map! :map rustic-mode-map (map! :map rustic-mode-map
:localleader :localleader
(:prefix ("b" . "build") (:prefix ("b" . "build")
:desc "cargo audit" "a" #'+rust/cargo-audit :desc "cargo audit" "a" #'+rust/cargo-audit
:desc "cargo build" "b" #'rustic-cargo-build :desc "cargo build" "b" #'rustic-cargo-build
:desc "cargo bench" "B" #'rustic-cargo-bench :desc "cargo bench" "B" #'rustic-cargo-bench
:desc "cargo check" "c" #'rustic-cargo-check :desc "cargo check" "c" #'rustic-cargo-check
:desc "cargo clippy" "C" #'rustic-cargo-clippy :desc "cargo clippy" "C" #'rustic-cargo-clippy
:desc "cargo doc" "d" #'rustic-cargo-build-doc :desc "cargo doc" "d" #'rustic-cargo-build-doc
:desc "cargo doc --open" "D" #'rustic-cargo-doc :desc "cargo doc --open" "D" #'rustic-cargo-doc
:desc "cargo fmt" "f" #'rustic-cargo-fmt :desc "cargo fmt" "f" #'rustic-cargo-fmt
:desc "cargo new" "n" #'rustic-cargo-new :desc "cargo new" "n" #'rustic-cargo-new
:desc "cargo outdated" "o" #'rustic-cargo-outdated :desc "cargo outdated" "o" #'rustic-cargo-outdated
:desc "cargo run" "r" #'rustic-cargo-run) :desc "cargo run" "r" #'rustic-cargo-run)
(:prefix ("t" . "cargo test") (:prefix ("t" . "cargo test")
:desc "all" "a" #'rustic-cargo-test :desc "all" "a" #'rustic-cargo-test
:desc "current test" "t" #'rustic-cargo-current-test))) :desc "current test" "t" #'rustic-cargo-current-test)))

View File

@@ -9,6 +9,10 @@
(modulep! :tools tree-sitter)) (modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)") "This module requires (:tools tree-sitter)")
(assert! (or (not (modulep! +tree-sitter))
(fboundp 'rust-ts-mode))
"Can't find `rust-ts-mode'; Emacs 29.1+ is required")
(unless (executable-find "rustc") (unless (executable-find "rustc")
(warn! "Couldn't find rustc binary")) (warn! "Couldn't find rustc binary"))

View File

@@ -30,11 +30,12 @@ Through the power of [[https://scalameta.org/metals/docs/editors/overview.html][
(supports metals). (supports metals).
- +tree-sitter :: - +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]]. editing. Requires Emacs 29.1+ and [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:sbt-mode]] - [[doom-package:sbt-mode]]
- [[doom-package:scala-mode]] - [[doom-package:scala-mode]]
- [[doom-package:scala-ts-mode]] if [[doom-module:+tree-sitter]]
- [[doom-package:lsp-metals]] if [[doom-module:+lsp]] - [[doom-package:lsp-metals]] if [[doom-module:+lsp]]
** Hacks ** Hacks

View File

@@ -7,24 +7,12 @@
;; ;;
;;; Packages ;;; Packages
(after! scala-mode (defun +scala-common-config (mode)
(setq scala-indent:align-parameters t (set-formatter! 'scalafmt '("scalafmt" "--stdin")
;; indent block comments to first asterix, not second :modes (list mode))
scala-indent:use-javadoc-style t) (set-repl-handler! mode #'+scala/open-repl
:persist t)
(setq-hook! 'scala-mode-hook (set-ligatures! mode
comment-line-break-function #'+scala-comment-indent-new-line-fn)
(when (modulep! +lsp)
(setq-hook! 'scala-mode-hook lsp-enable-indentation nil)
(add-hook 'scala-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'scala-mode-local-vars-hook #'tree-sitter! 'append))
(set-formatter! 'scalafmt '("scalafmt" "--stdin") :modes '(scala-mode))
(set-ligatures! 'scala-mode
;; Functional ;; Functional
:def "def" :def "def"
:composition "compose" :composition "compose"
@@ -49,9 +37,34 @@
;; Other ;; Other
:union "union" :union "union"
:intersect "intersect" :intersect "intersect"
:diff "diff")) :diff "diff")
(when (modulep! +lsp)
(add-hook (intern (format "%s-local-vars-hook" mode)) #'lsp! 'append)))
(use-package! sbt-mode (after! scala-mode
:after scala-mode (setq scala-indent:align-parameters t
:config (set-repl-handler! 'scala-mode #'+scala/open-repl :persist t)) ;; indent block comments to first asterix, not second
scala-indent:use-javadoc-style t)
(setq-hook! 'scala-mode-hook
comment-line-break-function #'+scala-comment-indent-new-line-fn
lsp-enable-indentation nil)
(+scala-common-config 'scala-mode))
(use-package! scala-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'scala-mode 'scala-ts-mode
'((scala :url "https://github.com/tree-sitter/tree-sitter-scala")))
:config
(when (modulep! +lsp)
(setq-hook! 'scala-ts-mode-hook lsp-enable-indentation nil))
(+scala-common-config 'scala-ts-mode))

View File

@@ -4,6 +4,10 @@
(package! sbt-mode :pin "cc68728a6ef0600aad369157b3a2d0ce56afba9b") (package! sbt-mode :pin "cc68728a6ef0600aad369157b3a2d0ce56afba9b")
(package! scala-mode :pin "661337d8aa0a0cb418184c83757661603de3b2e3") (package! scala-mode :pin "661337d8aa0a0cb418184c83757661603de3b2e3")
(when (and (modulep! +tree-sitter)
(fboundp 'treesit-available-p))
(package! scala-ts-mode :pin "c7671e10419261ef70b1820d3b970ad39f6fcfe2"))
(when (and (modulep! +lsp) (when (and (modulep! +lsp)
(modulep! :tools lsp -eglot)) (modulep! :tools lsp -eglot))
(package! lsp-metals :pin "e1d9d04f3bab7e6e74916054b36ab1a87e831367")) (package! lsp-metals :pin "e1d9d04f3bab7e6e74916054b36ab1a87e831367"))

View File

@@ -23,10 +23,7 @@ Fish script) to Doom Emacs.
(supports bash-language-server). (supports bash-language-server).
- +powershell :: - +powershell ::
Add syntax highlighting for Powershell script files (=.ps1= and =.psm1=). Add syntax highlighting for Powershell script files (=.ps1= and =.psm1=).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:company-shell]] if [[doom-module::completion company]] - [[doom-package:company-shell]] if [[doom-module::completion company]]
- [[doom-package:fish-mode]] if [[doom-module:+fish]] - [[doom-package:fish-mode]] if [[doom-module:+fish]]

View File

@@ -37,9 +37,6 @@
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'sh-mode-local-vars-hook #'lsp! 'append)) (add-hook 'sh-mode-local-vars-hook #'lsp! 'append))
(when (modulep! +tree-sitter)
(add-hook 'sh-mode-local-vars-hook #'tree-sitter! 'append))
(setq sh-indent-after-continuation 'always) (setq sh-indent-after-continuation 'always)
;; [pedantry intensifies] ;; [pedantry intensifies]

View File

@@ -7,7 +7,3 @@
(when (modulep! :editor format) (when (modulep! :editor format)
(unless (executable-find "shfmt") (unless (executable-find "shfmt")
(warn! "Couldn't find shfmt. Code formatting will not work."))) (warn! "Couldn't find shfmt. Code formatting will not work.")))
(assert! (or (modulep! -tree-sitter)
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")

View File

@@ -4,17 +4,23 @@
#+since: 21.12.0 #+since: 21.12.0
* Description :unfold: * Description :unfold:
THis module adds [[https://smlfamily.github.io/][SML (Standard ML) programming language]] support to Doom Emacs. This module adds [[https://smlfamily.github.io/][SML (Standard ML) programming language]] support to Doom Emacs.
** Maintainers ** Maintainers
*This module needs a maintainer.* [[doom-contrib-maintainer:][Become a maintainer?]] *This module needs a maintainer.* [[doom-contrib-maintainer:][Become a maintainer?]]
** Module flags ** Module flags
/This module has no flags./ - +lsp ::
Enable LSP support for ~sml-mode~/~sml-ts-mode~. Requires [[doom-module::tools lsp]]
and a langserver (supports [[https://github.com/azdavis/millet][millet-ls]]).
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
** Packages ** Packages
- [[doom-package:company-mlton]] if [[doom-module::completion company]] - [[doom-package:company-mlton]] if [[doom-module::completion company]]
- [[doom-package:sml-mode]] - [[doom-package:sml-mode]]
- [[doom-package:sml-ts-mode]] if [[doom-module:+tree-sitter]]
** Hacks ** Hacks
/No hacks documented for this module./ /No hacks documented for this module./

View File

@@ -3,11 +3,14 @@
(use-package! sml-mode (use-package! sml-mode
:mode "\\.s\\(?:ml\\|ig\\)\\'" :mode "\\.s\\(?:ml\\|ig\\)\\'"
:config :config
(set-repl-handler! 'sml-mode #'run-sml) (set-repl-handler! '(sml-mode sml-ts-mode) #'run-sml)
(set-formatter! 'smlformat '("smlformat") :modes '(sml-mode)) (set-formatter! 'smlformat '("smlformat") :modes '(sml-mode sml-ts-mode))
(when (modulep! +lsp)
(add-hook 'sml-mode-local-vars-hook #'lsp! 'append))
;; don't auto-close apostrophes (type 'a = foo) and backticks (`Foo) ;; don't auto-close apostrophes (type 'a = foo) and backticks (`Foo)
(sp-with-modes 'sml-mode (sp-with-modes '(sml-mode sml-ts-mode)
(sp-local-pair "'" nil :actions nil) (sp-local-pair "'" nil :actions nil)
(sp-local-pair "`" nil :actions nil)) (sp-local-pair "`" nil :actions nil))
@@ -23,6 +26,19 @@
:desc "Run region" "r" #'sml-prog-proc-send-region)) :desc "Run region" "r" #'sml-prog-proc-send-region))
;; TODO: Mirror sml-mode keybinds to ts-mode
(use-package! sml-ts-mode
:when (modulep! +tree-sitter)
:when (fboundp 'treesit-available-p)
:defer t
:init
(set-tree-sitter! 'sml-mode 'sml-ts-mode
'((sml :url "https://github.com/MatthewFluet/tree-sitter-sml")))
:config
(when (modulep! +lsp)
(add-hook 'sml-ts-mode-local-vars-hook #'lsp! 'append)))
(use-package! company-mlton (use-package! company-mlton
:when (modulep! :completion company) :when (modulep! :completion company)
:hook (sml-mode . company-mlton-init) :hook (sml-mode . company-mlton-init)

View File

@@ -1,5 +1,9 @@
;;; lang/sml/doctor.el -*- lexical-binding: t; -*- ;;; lang/sml/doctor.el -*- lexical-binding: t; -*-
(assert! (or (not (modulep! +tree-sitter))
(modulep! :tools tree-sitter))
"This module requires (:tools tree-sitter)")
(when (modulep! :editor format) (when (modulep! :editor format)
(unless (executable-find "smlformat") (unless (executable-find "smlformat")
(warn! "Couldn't find smlformat. Formatting will be disabled."))) (warn! "Couldn't find smlformat. Formatting will be disabled.")))

View File

@@ -6,3 +6,5 @@
(package! company-mlton (package! company-mlton
:recipe (:host github :repo "MatthewFluet/company-mlton" :files ("*.el" "*.basis")) :recipe (:host github :repo "MatthewFluet/company-mlton" :files ("*.el" "*.basis"))
:pin "9b09d209b4767a2af24784fb5321390ed1d445bf")) :pin "9b09d209b4767a2af24784fb5321390ed1d445bf"))
(when (modulep! +tree-sitter)
(package! sml-ts-mode :pin "d2dabcc9d8f91eeee7048641e4c80fabb3583194"))

View File

@@ -19,6 +19,7 @@ This module adds support for the [[https://developer.apple.com/swift/][Swift pro
** Packages ** Packages
- [[doom-package:swift-mode]] - [[doom-package:swift-mode]]
- [[doom-package:swift-ts-mode]] if [[doom-module:+tree-sitter]]
- if [[doom-module:+lsp]] - if [[doom-module:+lsp]]
- [[doom-package:lsp-sourcekit]] - [[doom-package:lsp-sourcekit]]
- else - else

View File

@@ -1,13 +1,18 @@
;;; lang/swift/config.el -*- lexical-binding: t; -*- ;;; lang/swift/config.el -*- lexical-binding: t; -*-
(after! swift-mode (use-package! swift-mode
:defer t
:init
(when (modulep! +tree-sitter)
(set-tree-sitter! 'swift-mode 'swift-ts-mode
'((swift :url "https://github.com/alex-pinkus/tree-sitter-swift"))))
:config
(set-repl-handler! 'swift-mode #'run-swift) (set-repl-handler! 'swift-mode #'run-swift)
(set-eglot-client! 'swift-mode '("sourcekit-lsp")) (set-eglot-client! 'swift-mode '("sourcekit-lsp"))
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'swift-mode-local-vars-hook #'lsp! 'append)) (add-hook 'swift-mode-local-vars-hook #'lsp! 'append)))
(when (modulep! +tree-sitter)
(add-hook 'swift-mode-local-vars-hook #'tree-sitter! 'append)))
(use-package! flycheck-swift (use-package! flycheck-swift

Some files were not shown because too many files have changed in this diff Show More