summary refs log tree commit diff
path: root/config/init-completion.el
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2024-04-06 11:22:57 -0700
committerFranck Cuny <franck@fcuny.net>2024-04-06 11:22:57 -0700
commit7c5780a719565630f58e7751afa8c7e458c49871 (patch)
treef8863ebcbd4a1e551a63374b3fee589affca1393 /config/init-completion.el
parentmove some display stuff (diff)
downloademacs.d-7c5780a719565630f58e7751afa8c7e458c49871.tar.gz
a org file is definitely not the way for me
Diffstat (limited to 'config/init-completion.el')
-rw-r--r--config/init-completion.el129
1 files changed, 129 insertions, 0 deletions
diff --git a/config/init-completion.el b/config/init-completion.el
new file mode 100644
index 0000000..5a3f785
--- /dev/null
+++ b/config/init-completion.el
@@ -0,0 +1,129 @@
+;;; init-completion.el --- Configure completion -*- lexical-binding: t -*-
+;; Author: Franck Cuny <franck@fcuny.net>
+
+;;; Commentary:
+
+;; Configure completions
+
+;;; Code:
+
+(use-package consult
+  :ensure t
+  :bind (("C-c m"   . consult-mode-command)
+	 ("M-g o"   . consult-org-heading)
+	 ("C-x b"   . consult-buffer)
+	 ("C-x r b" . consult-bookmark)
+	 ("C-x p b" . consult-project-buffer)
+	 ("C-c i"   . consult-imenu)
+	 ("M-g e"   . consult-compile-error)
+	 ("M-g g"   . consult-goto-line)
+	 ("M-g M-g" . consult-goto-line)
+	 ("M-g m"   . consult-mark)
+	 ("M-g k"   . consult-global-mark)))
+
+(use-package corfu
+  :ensure t
+  :demand t
+  :bind (("M-/" . completion-at-point)
+	 :map corfu-map
+	 ("C-n"      . corfu-next)
+	 ("C-p"      . corfu-previous)
+	 ("<return>" . corfu-insert)
+	 ("M-d"      . corfu-info-documentation)
+	 ("M-l"      . corfu-info-location)
+	 ("M-."      . corfu-move-to-minibuffer))
+  :custom
+  ;; Works with `indent-for-tab-command'. Make sure tab doesn't indent when you
+  ;; want to perform completion
+  (tab-always-indent 'complete)
+  (completion-cycle-threshold t)      ; Always show candidates in menu
+
+  (corfu-auto t)
+  (corfu-auto-prefix 2)
+  (corfu-auto-delay 0.25)
+
+  (corfu-min-width 80)
+  (corfu-max-width corfu-min-width)     ; Always have the same width
+  (corfu-cycle t)
+
+  ;; `nil' means to ignore `corfu-separator' behavior, that is, use the older
+  ;; `corfu-quit-at-boundary' = nil behavior. Set this to separator if using
+  ;; `corfu-auto' = `t' workflow (in that case, make sure you also set up
+  ;; `corfu-separator' and a keybind for `corfu-insert-separator', which my
+  ;; configuration already has pre-prepared). Necessary for manual corfu usage with
+  ;; orderless, otherwise first component is ignored, unless `corfu-separator'
+  ;; is inserted.
+  (corfu-quit-at-boundary nil)
+  (corfu-separator ?\s)            ; Use space
+  (corfu-quit-no-match 'separator) ; Don't quit if there is `corfu-separator' inserted
+  (corfu-preview-current 'insert)  ; Preview first candidate. Insert on input if only one
+  (corfu-preselect-first t)        ; Preselect first candidate?
+
+  ;; Other
+  (corfu-echo-documentation nil)        ; Already use corfu-popupinfo
+
+  :init
+  ;; see https://github.com/minad/corfu#completing-in-the-eshell-or-shell
+  (add-hook 'eshell-mode-hook
+            (lambda ()
+              (setq-local corfu-auto nil)
+              (corfu-mode)))
+  :config
+  (global-corfu-mode))
+
+(use-package corfu-popupinfo
+  :after corfu
+  :hook (corfu-mode . corfu-popupinfo-mode)
+  :bind (:map corfu-map
+              ("M-n" . corfu-popupinfo-scroll-up)
+              ("M-p" . corfu-popupinfo-scroll-down)
+              ([remap corfu-show-documentation] . corfu-popupinfo-toggle))
+  :custom
+  (corfu-popupinfo-delay 0.5)
+  (corfu-popupinfo-max-width 70)
+  (corfu-popupinfo-max-height 20)
+  ;; Also here to be extra-safe that this is set when `corfu-popupinfo' is
+  ;; loaded. I do not want documentation shown in both the echo area and in
+  ;; the `corfu-popupinfo' popup.
+  (corfu-echo-documentation nil))
+
+(use-package cape
+  :demand t
+  :ensure t
+  :bind (("C-c . p" . completion-at-point)
+	 ("C-c . h" . cape-history)
+	 ("C-c . f" . cape-file)
+	 ("C-c . a" . cape-abbrev)
+	 ("C-c . l" . cape-line)
+	 ("C-c . w" . cape-dict)
+	 ("C-c . r" . cape-rfc1345))
+  :init
+  ;; Add `completion-at-point-functions', used by `completion-at-point'.
+  (add-to-list 'completion-at-point-functions #'cape-file)
+  (add-to-list 'completion-at-point-functions #'cape-abbrev))
+
+(use-package marginalia
+  :ensure t
+  ;; Either bind `marginalia-cycle' globally or only in the minibuffer
+  :bind (:map minibuffer-local-map
+              ("M-A" . marginalia-cycle))
+  :init
+  ;; Must be in the :init section of use-package such that the mode gets
+  ;; enabled right away. Note that this forces loading the package.
+  (marginalia-mode))
+
+(use-package orderless
+  :demand t
+  :ensure t
+  :custom
+  (completion-styles '(orderless basic))
+  (completion-category-defaults nil))
+
+(use-package vertico
+  :ensure t
+  :config
+  (vertico-mode))
+
+(provide 'init-completion)
+
+;;; init-completion.el ends here