mirror of
https://github.com/doomemacs/doomemacs
synced 2025-08-31 14:43:40 -05:00
I removed the grammar recipes in3b58741
to avoid redundancy with the upstream recipes, but didn't realize that those upstream recipes weren't added until Emacs 31, so users on 30 and older would get errors when trying to install any missing grammars. This also establishes a hard dependency between :lang (php +tree-sitter) and :lang ({javascript,web} +tree-sitter). Amend:3b58741522
145 lines
5.3 KiB
EmacsLisp
145 lines
5.3 KiB
EmacsLisp
;;; lang/julia/config.el -*- lexical-binding: t; -*-
|
|
|
|
(use-package! julia-mode
|
|
:interpreter "julia"
|
|
:config
|
|
(unless (modulep! +snail)
|
|
(set-repl-handler! '(julia-mode julia-ts-mode) #'+julia/open-repl))
|
|
|
|
(when (modulep! +lsp)
|
|
(add-hook 'julia-mode-local-vars-hook #'lsp! 'append))
|
|
|
|
;; Borrow matlab.el's fontification of math operators. From
|
|
;; <https://web.archive.org/web/20170326183805/https://ogbe.net/emacsconfig.html>
|
|
(dolist (mode '(julia-mode ess-julia-mode))
|
|
(font-lock-add-keywords
|
|
mode
|
|
`((,(let ((OR "\\|"))
|
|
(concat "\\(" ; stolen `matlab.el' operators first
|
|
;; `:` defines a symbol in Julia and must not be highlighted
|
|
;; as an operator. The only operators that start with `:` are
|
|
;; `:<` and `::`. This must be defined before `<`.
|
|
"[:<]:" OR
|
|
"[<>]=?" OR
|
|
"\\.[/*^']" OR
|
|
"===" OR
|
|
"==" OR
|
|
"=>" OR
|
|
"\\<xor\\>" OR
|
|
"[-+*\\/^&|$]=?" OR ; this has to come before next (updating operators)
|
|
"[-^&|*+\\/~]" OR
|
|
;; Julia variables and names can have `!`. Thus, `!` must be
|
|
;; highlighted as a single operator only in some
|
|
;; circumstances. However, full support can only be
|
|
;; implemented by a full parser. Thus, here, we will handle
|
|
;; only the simple cases.
|
|
"[[:space:]]!=?=?" OR "^!=?=?" OR
|
|
;; The other math operators that starts with `!`.
|
|
;; more extra julia operators follow
|
|
"[%$]" OR
|
|
;; bitwise operators
|
|
">>>" OR ">>" OR "<<" OR
|
|
">>>=" OR ">>" OR "<<" OR
|
|
"\\)"))
|
|
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
|
|
:preface (defvar +julia-repl-start-hook nil)
|
|
: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-repl-use-emacsclient)
|
|
:config
|
|
(unless (modulep! +snail)
|
|
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil))
|
|
|
|
(when (modulep! :ui workspaces)
|
|
(defadvice! +julia--namespace-repl-buffer-to-workspace-a (&optional executable-key suffix)
|
|
"Name for a Julia REPL inferior buffer. Uses workspace name for doom emacs"
|
|
:override #'julia-repl--inferior-buffer-name
|
|
(concat julia-repl-inferior-buffer-name-base ":" (+workspace-current-name))))
|
|
|
|
(defadvice! +julia--run-start-hook-a (inferior-buffer)
|
|
"Run `+julia-repl-start-hook' before displaying the REPL."
|
|
:after #'julia-repl--setup-term
|
|
(with-current-buffer inferior-buffer
|
|
(run-hooks '+julia-repl-start-hook)))
|
|
|
|
(defun +julia-override-repl-escape-char-h ()
|
|
"Use C-c instead of C-x for escaping."
|
|
(term-set-escape-char ?\C-c)))
|
|
|
|
|
|
(use-package! lsp-julia
|
|
:when (modulep! +lsp)
|
|
:unless (modulep! :tools lsp +eglot)
|
|
:defer t
|
|
:preface
|
|
(after! lsp-mode (add-to-list 'lsp-client-packages 'lsp-julia))
|
|
(setq lsp-julia-default-environment nil)
|
|
:init
|
|
;; If no environment is set, then auto-detect one in ~/.julia/environments/,
|
|
;; falling back to `lsp-julia-default-environment's default.
|
|
(unless lsp-julia-default-environment
|
|
(setq lsp-julia-default-environment
|
|
(or (car (last (doom-glob "~/.julia/environments/v*")))
|
|
"~/.julia/environments/v1.6"))))
|
|
|
|
|
|
(use-package! eglot-jl
|
|
:when (modulep! +lsp)
|
|
:when (modulep! :tools lsp +eglot)
|
|
:after eglot
|
|
:init
|
|
;; Prevent timeout while installing LanguageServer.jl
|
|
(setq-hook! '(julia-mode-hook julia-ts-mode-hook)
|
|
eglot-connect-timeout (max eglot-connect-timeout 60))
|
|
:config (eglot-jl-init))
|
|
|
|
|
|
(use-package! julia-snail
|
|
:when (modulep! +snail)
|
|
:when (modulep! :term vterm)
|
|
:hook (julia-mode . julia-snail-mode)
|
|
:hook (julia-ts-mode . julia-snail-mode)
|
|
:config
|
|
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil :select nil :quit nil)
|
|
|
|
(setq-default julia-snail-multimedia-enable t)
|
|
|
|
(after! julia-mode
|
|
(set-repl-handler! 'julia-mode #'+julia/open-snail-repl
|
|
:persist t
|
|
;; FIXME These aren't working as expected
|
|
:send-region #'julia-snail-send-region
|
|
:send-buffer #'julia-snail-send-buffer-file))
|
|
|
|
(map! (:localleader
|
|
(:map (julia-snail-mode-map)
|
|
"'" #'julia-snail
|
|
"a" #'julia-snail-package-activate
|
|
"r" #'julia-snail-update-module-cache
|
|
"d" #'julia-snail-doc-lookup
|
|
(:prefix ("e" . "eval")
|
|
"b" #'julia-snail-send-buffer-file
|
|
"l" #'julia-snail-send-line
|
|
"r" #'julia-snail-send-region
|
|
"e" #'julia-snail-send-dwim))
|
|
(:map (julia-snail-repl-mode-map)
|
|
"a" #'julia-snail-package-activate
|
|
"d" #'julia-snail-doc-lookup
|
|
"m" #'julia-snail-repl-go-back
|
|
"r" #'julia-snail-update-module-cache))))
|