emacs/lisp/icejam-complete-at-point.el
Maciej Szlosarczyk 1b64c05b0f
Some checks failed
/ Test config on 20 (push) Failing after 56s
Shorten corfu completion delay
2026-01-22 15:26:15 +02:00

95 lines
3.4 KiB
EmacsLisp

;;; icejam-complete-at-point.el -- summary -*- lexical-binding: t; -*-
;;; Commentary:
;;; Completion framework configuration
;;; Code:
(use-package yasnippet :ensure t :defer t
:hook ((elpaca-after-init . yas-global-mode))
:config
(unbind-key "C-c & C-n" yas-minor-mode-map)
(unbind-key "C-c & C-s" yas-minor-mode-map)
(unbind-key "C-c & C-v" yas-minor-mode-map))
(use-package yasnippet-snippets :ensure t :after (yasnippet))
;; Corfu is the main engine for displaying suggestions.
(use-package corfu :ensure t :defer t
:hook ((elpaca-after-init . global-corfu-mode)
(global-corfu-mode . corfu-popupinfo-mode))
:config
;; Go up to go the the last item on the list
(setopt corfu-cycle t
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
corfu-bar-width 0.5
;; Do not insert when you type a word that happens to be a
;; completion candidate. A typical example is `format`, which
;; is a yas snippet.
corfu-on-exact-match 'quit
corfu-quit-at-boundary t
corfu-popupinfo-delay '(0.4 . 0.2)
corfu-auto t
corfu-auto-delay 0.2
corfu-quit-no-match 'separator
;; Invoke completion with tab when needed.
tab-always-indent 'complete))
;; Allow corfu to work in terminal
(use-package corfu-terminal :ensure t :defer t
:if (not (display-graphic-p))
:hook ((elpaca-after-init . corfu-terminal-mode)))
;; These are actual completions
(use-package cape :ensure t :after corfu
:config
(declare-function cape-dabbrev 'cape)
(declare-function cape-file 'cape)
(declare-function cape-keyword 'cape)
(declare-function cape-elisp-symbol 'cape)
(declare-function cape-capf-super 'cape)
;; Set default completion values:
(set-default 'completion-at-point-functions
(list (cape-capf-super #'cape-dabbrev #'yasnippet-capf)
#'cape-file
#'cape-keyword)))
(defun icejam-set-no-eglot-capfs ()
"Set `completion-at-point-function` to non-LSP list."
(setq-local completion-at-point-functions
(list (cape-capf-super #'cape-dabbrev #'yasnippet-capf)
#'cape-file
#'cape-keyword)))
(defun icejam-set-eglot-capfs ()
"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)))
(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)))
(use-package yasnippet-capf :ensure t :after corfu :defer t
:config
(declare-function yasnippet-capf 'yasnippet)
(setopt yasnippet-capf-lookup-by 'name))
(use-package nerd-icons-corfu :ensure t :defer 5
:after corfu
:config
(declare-function nerd-icons-corfu-formatter 'nerd-icons-corfu)
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
(provide 'icejam-complete-at-point)
;;; icejam-complete-at-point.el ends here