|
| 1 | +;;; completion/corfu/config.el -*- lexical-binding: t; -*- |
| 2 | + |
| 3 | +(use-package! corfu |
| 4 | + :custom |
| 5 | + (corfu-separator ?\s) |
| 6 | + (corfu-auto t) |
| 7 | + (corfu-auto-delay 0.0) |
| 8 | + (corfu-on-exact-match nil) |
| 9 | + (corfu-quit-no-match t) |
| 10 | + (corfu-cycle t) |
| 11 | + (corfu-auto-prefix 2) |
| 12 | + (completion-cycle-threshold 1) |
| 13 | + (tab-always-indent 'complete) |
| 14 | + :hook |
| 15 | + (doom-first-buffer . global-corfu-mode) |
| 16 | + :config |
| 17 | + (when (featurep! +minibuffer) |
| 18 | + (add-hook 'minibuffer-setup-hook #'+corfu--enable-in-minibuffer)) |
| 19 | + |
| 20 | + ;; Dirty hack to get c completion running |
| 21 | + ;; Discussion in https://github.com/minad/corfu/issues/34 |
| 22 | + (when (and (featurep! :lang cc) |
| 23 | + (equal tab-always-indent 'complete)) |
| 24 | + (map! :map c-mode-base-map |
| 25 | + :i [remap c-indent-line-or-region] #'completion-at-point)) |
| 26 | + |
| 27 | + ;; Reset lsp-completion provider |
| 28 | + (add-hook 'doom-init-modules-hook |
| 29 | + (lambda () |
| 30 | + (after! lsp-mode |
| 31 | + (setq lsp-completion-provider :none)))) |
| 32 | + |
| 33 | + ;; Set orderless filtering for LSP-mode completions |
| 34 | + (add-hook 'lsp-completion-mode-hook |
| 35 | + (lambda () |
| 36 | + (setf (alist-get 'lsp-capf completion-category-defaults) '((styles . (orderless flex)))))) |
| 37 | + |
| 38 | + (map! :map corfu-map |
| 39 | + "C-SPC" #'corfu-insert-separator |
| 40 | + "C-n" #'corfu-next |
| 41 | + "C-p" #'corfu-previous |
| 42 | + (:prefix "C-x" |
| 43 | + "C-k" #'cape-dict |
| 44 | + "C-f" #'cape-file)) |
| 45 | + (after! evil |
| 46 | + (advice-add 'corfu--setup :after 'evil-normalize-keymaps) |
| 47 | + (advice-add 'corfu--teardown :after 'evil-normalize-keymaps) |
| 48 | + (evil-make-overriding-map corfu-map)) |
| 49 | + |
| 50 | + (defadvice! +corfu--org-return (orig) :around '+org/return |
| 51 | + (if (and (featurep! :completion corfu) |
| 52 | + corfu-mode |
| 53 | + (>= corfu--index 0)) |
| 54 | + (corfu-insert) |
| 55 | + (funcall orig))) |
| 56 | + |
| 57 | + (unless (display-graphic-p) |
| 58 | + (corfu-doc-terminal-mode) |
| 59 | + (corfu-terminal-mode))) |
| 60 | + |
| 61 | + |
| 62 | +(use-package! corfu-doc |
| 63 | + :hook (corfu-mode . corfu-doc-mode) |
| 64 | + :custom |
| 65 | + (corfu-doc-delay 0) |
| 66 | + :bind (:map corfu-map |
| 67 | + ("M-n" . corfu-doc-scroll-down) |
| 68 | + ("M-p" . corfu-doc-scroll-up) |
| 69 | + ("M-d" . corfu-doc-toggle))) |
| 70 | + |
| 71 | + |
| 72 | +(use-package! orderless |
| 73 | + :when (featurep! +orderless) |
| 74 | + :init |
| 75 | + (setq completion-styles '(orderless partial-completion) |
| 76 | + completion-category-defaults nil |
| 77 | + completion-category-overrides '((file (styles . (partial-completion)))))) |
| 78 | + |
| 79 | + |
| 80 | +(use-package! kind-icon |
| 81 | + :after corfu |
| 82 | + :when (featurep! +icons) |
| 83 | + :custom |
| 84 | + (kind-icon-default-face 'corfu-default) |
| 85 | + :config |
| 86 | + (setq kind-icon-use-icons t |
| 87 | + svg-lib-icons-dir (expand-file-name "svg-lib" doom-cache-dir) |
| 88 | + kind-icon-mapping |
| 89 | + '((array "a" :icon "code-brackets" :face font-lock-variable-name-face) |
| 90 | + (boolean "b" :icon "circle-half-full" :face font-lock-builtin-face) |
| 91 | + (class "c" :icon "view-grid-plus-outline" :face font-lock-type-face) |
| 92 | + (color "#" :icon "palette" :face success) |
| 93 | + (constant "co" :icon "pause-circle" :face font-lock-constant-face) |
| 94 | + (constructor "cn" :icon "table-column-plus-after" :face font-lock-function-name-face) |
| 95 | + (enum "e" :icon "format-list-bulleted-square" :face font-lock-builtin-face) |
| 96 | + (enum-member "em" :icon "format-list-checks" :face font-lock-builtin-face) |
| 97 | + (event "ev" :icon "lightning-bolt-outline" :face font-lock-warning-face) |
| 98 | + (field "fd" :icon "application-braces-outline" :face font-lock-variable-name-face) |
| 99 | + (file "f" :icon "file" :face font-lock-string-face) |
| 100 | + (folder "d" :icon "folder" :face font-lock-doc-face) |
| 101 | + (function "f" :icon "sigma" :face font-lock-function-name-face) |
| 102 | + (interface "if" :icon "video-input-component" :face font-lock-type-face) |
| 103 | + (keyword "kw" :icon "image-filter-center-focus" :face font-lock-keyword-face) |
| 104 | + (macro "mc" :icon "lambda" :face font-lock-keyword-face) |
| 105 | + (method "m" :icon "sigma" :face font-lock-function-name-face) |
| 106 | + (module "{" :icon "view-module" :face font-lock-preprocessor-face) |
| 107 | + (numeric "nu" :icon "numeric" :face font-lock-builtin-face) |
| 108 | + (operator "op" :icon "plus-circle-outline" :face font-lock-comment-delimiter-face) |
| 109 | + (param "pa" :icon "cog" :face default) |
| 110 | + (property "pr" :icon "tune-vertical" :face font-lock-variable-name-face) |
| 111 | + (reference "rf" :icon "bookmark-box-multiple" :face font-lock-variable-name-face) |
| 112 | + (snippet "S" :icon "text-short" :face font-lock-string-face) |
| 113 | + (string "s" :icon "sticker-text-outline" :face font-lock-string-face) |
| 114 | + (struct "%" :icon "code-braces" :face font-lock-variable-name-face) |
| 115 | + (t "." :icon "crosshairs-question" :face shadow) |
| 116 | + (text "tx" :icon "script-text-outline" :face shadow) |
| 117 | + (type-parameter "tp" :icon "format-list-bulleted-type" :face font-lock-type-face) |
| 118 | + (unit "u" :icon "ruler-square" :face shadow) |
| 119 | + (value "v" :icon "numeric-1-box-multiple-outline" :face font-lock-builtin-face) |
| 120 | + (variable "va" :icon "adjust" :face font-lock-variable-name-face)) |
| 121 | + kind-icon-default-style '(:padding 0 :stroke 0 :margin 0 :radius 0 :height 0.95 :scale 0.95)) |
| 122 | + (add-hook 'doom-load-theme-hook #'kind-icon-reset-cache) |
| 123 | + (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter)) |
| 124 | + |
| 125 | + |
| 126 | +(use-package! cape |
| 127 | + :defer t |
| 128 | + :init |
| 129 | + (map! |
| 130 | + [remap dabbrev-expand] 'cape-dabbrev) |
| 131 | + (add-hook! 'latex-mode-hook (defun +corfu--latex-set-capfs () |
| 132 | + (add-to-list 'completion-at-point-functions #'cape-tex))) |
| 133 | + (when (featurep! :checkers spell) |
| 134 | + (add-to-list 'completion-at-point-functions #'cape-dict) |
| 135 | + (add-to-list 'completion-at-point-functions #'cape-ispell)) |
| 136 | + (add-to-list 'completion-at-point-functions #'cape-file) |
| 137 | + (add-to-list 'completion-at-point-functions #'cape-keyword t) |
| 138 | + (add-to-list 'completion-at-point-functions #'cape-dabbrev t)) |
| 139 | + |
| 140 | + |
| 141 | +(use-package! corfu-history |
| 142 | + :after corfu |
| 143 | + :hook (corfu-mode . (lambda () |
| 144 | + (corfu-history-mode 1) |
| 145 | + (savehist-mode 1) |
| 146 | + (add-to-list 'savehist-additional-variables 'corfu-history)))) |
| 147 | + |
| 148 | + |
| 149 | +(use-package! corfu-quick |
| 150 | + :after corfu |
| 151 | + :bind (:map corfu-map |
| 152 | + ("M-q" . corfu-quick-complete) |
| 153 | + ("C-q" . corfu-quick-insert))) |
| 154 | + |
| 155 | + |
| 156 | +;; TODO This doesn't _quite_ work |
| 157 | +(use-package! evil-collection-corfu |
| 158 | + :when (featurep! :editor evil +everywhere) |
| 159 | + :defer t |
| 160 | + :init (setq evil-collection-corfu-key-themes '(default magic-return)) |
| 161 | + :config |
| 162 | + (evil-collection-corfu-setup)) |
0 commit comments