summaryrefslogtreecommitdiff
path: root/lisp/td-programming.el
blob: eee8d67ac293a2228150b9b1c9160d4b7e013ca1 (plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
;;; -*- lexical-binding: t; -*-

;;; ----- Completion -----

(use-package cape
  :defer 10
  :init
  ;; Add `completion-at-point-functions', used by `completion-at-point'.
  (add-to-list 'completion-at-point-functions #'cape-file)
  ;; Nice completion to have available everywhere.
  (add-to-list 'completion-at-point-functions #'cape-dabbrev)
  :config
  ;; Silence then pcomplete capf, no errors or messages.
  (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-silent)
  ;; Ensure that pcomplete does not write to the buffer and behaves as a pure
  ;; `completion-at-point-function'.
  (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-purify))

(use-package corfu
  :ensure t
  :custom
  (corfu-cycle t)                     ; Cycle through candidates
  (corfu-auto t)                      ; Enable auto completion.
  (corfu-auto-prefix 2)               ; Display completion options after two characters.
  (corfu-auto-delay 0.0)              ; Don't delay.
  (corfu-quit-at-boundary 'separator) ; Quit if no separator has been inserted at the boundary.
  (corfu-echo-documentation 0.25)     ; Echo docs shortly after options.
  (corfu-preview-current 'insert)     ; Auto-insert the current completion.
  (corfu-preselect-first nil)         ; Don't select a completion right away.
  :bind (:map corfu-map
              ("M-SPC"      . corfu-insert-separator)
              ("C-n"        . corfu-next)
              ([tab]        . corfu-next)
              ("C-p"        . corfu-previous)
              ([backtab]    . corfu-previous)
              ("S-<return>" . corfu-insert)
              ("RET"        . nil))
  :init
  ;; Use corfu everywhere.
  (global-corfu-mode)
  ;; Save completion history for better sorting.
  (corfu-history-mode))

(use-package eglot
  :ensure t
  :defer t
  :config
  (setq eglot-autoshutdown t
        elgot-ignored-server-capabilities '(:inlayHintProvider))
  (add-to-list 'eglot-server-programs '(c-mode       . ("clangd")))
  (add-to-list 'eglot-server-programs '(c++-mode     . ("clangd")))
  (add-to-list 'eglot-server-programs '(nix-mode     . ("nixd")))
  (add-to-list 'eglot-server-programs '(python-mode  . ("pylsp")))
  (add-to-list 'eglot-server-programs '(rust-mode    . ("rust-analyzer")))
  :hook
  ((c-mode      . eglot-ensure)
   (c++-mode    . eglot-ensure)
   (nix-mode    . eglot-ensure)
   (python-mode . eglot-ensure)
   (rust-mode   . eglot-ensure)))

(use-package orderless
  :ensure t
  :commands (orderless)
  :custom
  (completion-styles '(orderless flex)))

;;; ----- Modes -----

(use-package dockerfile-mode
  :ensure t
  :defer t)

(use-package markdown-mode
  :ensure t
  :defer t)

(use-package nix-mode
  :ensure t
  :defer t)

(use-package python-mode
  :ensure t
  :defer t)

(use-package rust-mode
  :ensure t
  :defer t
  :config
  (setq rust-format-on-save nil))

(use-package toml-mode
  :ensure t
  :defer t)

(use-package yaml-mode
  :ensure t
  :defer t)

;;; ----- Tooling & Enhancements -----

(use-package compile
  ;; Using `C-u' before recompile acts like `M-x compile'.
  :bind (("C-x C-m" . recompile))
  :custom
  (compilation-scroll-output t))

(use-package magit
  :ensure t
  :commands magit-status)

(use-package paren-face
  :ensure t
  :hook ((prog-mode
          eshell-mode
          inferior-lisp-mode
          inferior-emacs-lisp-mode
          lisp-interaction-mode
          sly-mrepl-mode
          scheme-mode)
         . paren-face-mode))

(provide 'td-programming)