blob: c46fed4d3d8275baa4d20983cbb4887f17c13984 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
;;; init-eglot.el --- configure lsp integration -*- lexical-binding:t -*-
;;; Commentary:
;;; Code:
(defvar mpolden/inhibit-format-before-save nil
"List of modes where `eglot-format' should not be run before saving the buffer.")
(defvar mpolden/inhibit-organize-imports-before-save nil
"List of modes where `eglot-code-action-organize-imports' should not be run before saving the buffer.")
(defvar mpolden/inhibit-lsp nil
"List of modes where `eglot-ensure' should not be called to enable LSP integration.")
(defun mpolden/format-before-save ()
"Format buffer before saving."
(unless (member major-mode mpolden/inhibit-format-before-save)
(eglot-format)))
(defun mpolden/organize-imports-before-save ()
"Organize imports before saving buffer."
(unless (member major-mode mpolden/inhibit-organize-imports-before-save)
(call-interactively 'eglot-code-action-organize-imports)))
(defun mpolden/eglot-before-save ()
"All actions that may run before saving buffer."
(unless (member major-mode mpolden/inhibit-lsp)
(mpolden/format-before-save)
(mpolden/organize-imports-before-save)))
(defun mpolden/eglot-ensure ()
"Enable Eglot for current `major-mode'."
(unless (member major-mode mpolden/inhibit-lsp)
(eglot-ensure)))
(use-package eglot
:ensure t
:init
;; eglot passes tab-width as tab size to the lsp server, but most language
;; servers treat this as an indentation width
;; https://github.com/joaotavora/eglot/issues/157
;;
;; set a default value that fits most languages
(setq-default tab-width 4)
:hook
;; load eglot automatically for these modes
((go-mode . mpolden/eglot-ensure)
(java-mode . mpolden/eglot-ensure)
(python-mode . mpolden/eglot-ensure)
(rust-mode . mpolden/eglot-ensure)
(before-save . mpolden/eglot-before-save))
:bind (:map eglot-mode-map
;; C-c r renames identifier
("C-c r" . eglot-rename)
;; C-c f formats buffer
("C-c f" . eglot-format)
;; C-c o organizes imports
("C-c o" . eglot-code-action-organize-imports)
;; C-c q shows code actions (quickfix)
("C-c q" . eglot-code-actions)))
(provide 'init-eglot)
;;; init-eglot.el ends here
|