From e7d2eb2271f073f4562794ccdb24501ee50172da Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Wed, 29 Apr 2026 11:12:51 +0300 Subject: [PATCH] Reconfigure Elixir LSP server a little bit --- lisp/icejam-complete-at-point.el | 17 ++++++++------- lisp/icejam-eglot.el | 36 +++++++++++++++++++++++++++++++- lisp/langs/icejam-lang-elixir.el | 4 ++-- snippets/elixir-mode/desc | 7 ------- 4 files changed, 46 insertions(+), 18 deletions(-) delete mode 100644 snippets/elixir-mode/desc diff --git a/lisp/icejam-complete-at-point.el b/lisp/icejam-complete-at-point.el index 01f0acb..4616716 100644 --- a/lisp/icejam-complete-at-point.el +++ b/lisp/icejam-complete-at-point.el @@ -8,6 +8,7 @@ (declare-function cape-file 'cape) (declare-function cape-keyword 'cape) (declare-function cape-elisp-symbol 'cape) + (declare-function cape-capf-prefix-length 'cape) (declare-function cape-capf-super 'cape) (declare-function yasnippet-capf 'yasnippet) (declare-function nerd-icons-corfu-formatter 'nerd-icons-corfu) @@ -29,7 +30,7 @@ :config ;; Go up to go the the last item on the list (setopt corfu-cycle t - corfu-count 20 ;; Show 20 completion candidates + corfu-count 20 ;; Show 20 completion candidates corfu-max-width 100 ;; Max width of the corfu frame corfu-right-margin-width 0.5 corfu-left-margin-width 0.5 @@ -72,18 +73,18 @@ "Set `completion-at-point-function` to list where LSP is supported." (setq-local completion-at-point-functions (list - (cape-capf-super #'yasnippet-capf #'eglot-completion-at-point) - #'cape-dabbrev - #'cape-file))) + (cape-capf-super #'yasnippet-capf #'eglot-completion-at-point) + #'cape-dabbrev + #'cape-file))) (defun icejam-set-elisp-capfs () "Set `completion-at-point-function` to what is useful in Elisp." (setq-local completion-at-point-functions (list (cape-capf-super #'elisp-completion-at-point - #'yasnippet-capf) - #'cape-dabbrev - #'cape-file - #'cape-elisp-symbol))) + #'yasnippet-capf) + #'cape-dabbrev + #'cape-file + #'cape-elisp-symbol))) (use-package yasnippet-capf :ensure t :after corfu :defer t :config diff --git a/lisp/icejam-eglot.el b/lisp/icejam-eglot.el index 177036a..cf4726a 100644 --- a/lisp/icejam-eglot.el +++ b/lisp/icejam-eglot.el @@ -3,10 +3,44 @@ ;;; Global Language Server Protocol Config ;;; Code: +(eval-when-compile + (declare-function eglot-completion-at-point 'eglot) + (declare-function eglot-managed-p 'eglot)) + (use-package eglot :ensure nil :config ;; Use Ruby-Lsp instead of Solargraph - (add-to-list 'eglot-server-programs '((ruby-mode ruby-ts-mode) "ruby-lsp"))) + (add-to-list 'eglot-server-programs '((ruby-mode ruby-ts-mode) "ruby-lsp")) + + (setopt eglot-advertise-cancellation t) + + ;; Automatically kill eglot when last buffer associated with a project is + ;; closed. + (setopt eglot-autoshutdown t) + + ;; Set up server specific switches globally + (setq-default eglot-workspace-configuration + ;; Elixir configuration + '(:elixirLS ( + :autoBuild t + :dialyzerEnabled t + :incrementalDialyzer :json-false + :autoInsertRequiredAlias :json-false + :suggestSpecs t + ))) + + ;; Eglot insists on adding itself to the completion-at-point-functions but + ;; that means that it overrides our combined value of (eglot + yasnippet) + (add-hook 'eglot-managed-mode-hook + (lambda () + (when eglot--managed-mode + (remove-hook 'completion-at-point-functions + #'eglot-completion-at-point t))))) + +(defun icejam-start-eglot () + "Start eglot unless already started." + (unless (eglot-managed-p) + (eglot-ensure))) (use-package eldoc-box :ensure (:host github :repo "casouri/eldoc-box") diff --git a/lisp/langs/icejam-lang-elixir.el b/lisp/langs/icejam-lang-elixir.el index c09aa8b..57c59db 100644 --- a/lisp/langs/icejam-lang-elixir.el +++ b/lisp/langs/icejam-lang-elixir.el @@ -10,6 +10,7 @@ (declare-function yas--remove-template-by-uuid 'yasnippet) (declare-function icejam-set-indent 'icejam-prog-mode) (declare-function icejam-set-eglot-capfs 'icejam-complete-at-point) + (declare-function icejam-start-eglot 'icejam-eglot) (defvar icejam-language-transient-alist) (defvar icejam-elixir-lang-menu) (defvar apheleia-mode-alist)) @@ -44,9 +45,8 @@ "All things Elixir." (icejam-set-indent 2) (column-enforce-n 98) - (eglot-ensure) - (icejam-set-eglot-capfs) + (icejam-start-eglot) (icejam-delete-elixir-snippets)) (add-hook 'heex-ts-mode-hook 'icejam-activate-elixir-ts-mode) diff --git a/snippets/elixir-mode/desc b/snippets/elixir-mode/desc deleted file mode 100644 index 0362bd9..0000000 --- a/snippets/elixir-mode/desc +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: snippet -*- -# name: desc -# key: desc -# -- -describe "$1" do - $0 -end