doomemacs/modules/lang/julia/config.el
Henrik Lissner acae9f9acb
bump: :tools lsp
emacs-lsp/lsp-mode@6b6afc00de -> emacs-lsp/lsp-mode@3fa645c039
joaotavora/eglot@e835996e16 -> joaotavora/eglot@bd970be047

- There are multiple issues in the lsp-mode
  repo (emacs-lsp/lsp-mode#2722), lsp-julia repo (gdkrmr/lsp-julia#23
  and gdkrmr/lsp-julia#35), and the LanguageServer.jl
  repo (julia-vscode/LanguageServer.jl#844) about crashes of the Julia
  LSP with lsp-mode due to errors caused by the folding capabilities
  announced by the client. One can work around these issues by enabling
  folding (see gdkrmr/lsp-julia#23) but that is only a hack and does not
  fix the underlying issue. The problem is caused by a violation of the
  LSP specs in lsp-mode which was fixed in emacs-lsp/lsp-mode#3593. The
  PR updates lsp-mode to the latest commit on the master branch which
  contains this fix (and some other unrelated fixes, CI passes
  successfully again), and hence the workaround for lsp-julia can be
  removed.

Ref: emacs-lsp/lsp-mode#3593
Ref: emacs-lsp/lsp-mode#2722
Ref: gdkrmr/lsp-julia#35
Ref: gdkrmr/lsp-julia#23
Ref: julia-vscode/LanguageServer.jl#844
Close: #6516
Co-authored-by: devmotion <devmotion@users.noreply.github.com>
2022-07-05 01:35:06 +02:00

100 lines
3.8 KiB
EmacsLisp

;;; lang/julia/config.el -*- lexical-binding: t; -*-
(use-package! julia-mode
:interpreter "julia"
:config
(set-repl-handler! 'julia-mode #'+julia/open-repl)
;; 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-repl
:preface (defvar +julia-repl-start-hook nil)
:hook (julia-mode . julia-repl-mode)
:hook (+julia-repl-start . +julia-override-repl-escape-char-h)
:hook (+julia-repl-start . julia-repl-use-emacsclient)
:config
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil)
(when (featurep! :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)))
(when (featurep! +lsp)
(add-hook 'julia-mode-local-vars-hook #'lsp! 'append))
(use-package! lsp-julia
:when (featurep! +lsp)
:unless (featurep! :tools lsp +eglot)
:after lsp-mode
:preface (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 (featurep! +lsp)
:when (featurep! :tools lsp +eglot)
:after eglot
:preface
;; Prevent auto-install of LanguageServer.jl
(setq eglot-jl-language-server-project "~/.julia/environments/v1.6")
:init
;; Prevent timeout while installing LanguageServer.jl
(setq-hook! 'julia-mode-hook eglot-connect-timeout (max eglot-connect-timeout 60))
:config (eglot-jl-init))
;; Tree sitter
(eval-when! (featurep! +tree-sitter)
(add-hook! 'julia-mode-local-vars-hook #'tree-sitter!))