mirror of
http://github.com/JaeUs3792/dotfiles
synced 2025-12-14 16:11:34 +09:00
154 lines
5.1 KiB
EmacsLisp
154 lines
5.1 KiB
EmacsLisp
;;; crafted-completion.el --- Crafted Completion Configuration -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 2022
|
|
;; SPDX-License-Identifier: MIT
|
|
|
|
;; Author: System Crafters Community
|
|
|
|
;;; Commentary:
|
|
|
|
;; Setup completion packages. Completion in this sense is more like
|
|
;; narrowing, allowing the user to find matches based on minimal
|
|
;; inputs and "complete" the commands, variables, etc from the
|
|
;; narrowed list of possible choices.
|
|
|
|
;;; Code:
|
|
|
|
(crafted-package-install-package 'cape)
|
|
(crafted-package-install-package 'consult)
|
|
(crafted-package-install-package 'corfu)
|
|
(crafted-package-install-package 'corfu-terminal)
|
|
(crafted-package-install-package 'embark)
|
|
(crafted-package-install-package 'embark-consult)
|
|
(crafted-package-install-package 'marginalia)
|
|
(crafted-package-install-package 'orderless)
|
|
(crafted-package-install-package 'vertico)
|
|
|
|
(defun crafted-completion/minibuffer-backward-kill (arg)
|
|
"Delete word or delete up to parent folder when completion is a file.
|
|
|
|
ARG is the thing being completed in the minibuffer."
|
|
(interactive "p")
|
|
(if minibuffer-completing-file-name
|
|
;; Borrowed from https://github.com/raxod502/selectrum/issues/498#issuecomment-803283608
|
|
(if (string-match-p "/." (minibuffer-contents))
|
|
(zap-up-to-char (- arg) ?/)
|
|
(delete-minibuffer-contents))
|
|
(backward-kill-word arg)))
|
|
|
|
|
|
;;; Vertico
|
|
(require 'vertico)
|
|
|
|
;; Straight and Package bundle the vertico package differently. When
|
|
;; using `package.el', the extensions are built into the package and
|
|
;; available on the load-path. When using `straight.el', the
|
|
;; extensions are not built into the package, so have to add that path
|
|
;; to the load-path manually to enable the following require.
|
|
(when (eq crafted-package-system 'straight)
|
|
(add-to-list 'load-path
|
|
(expand-file-name "straight/build/vertico/extensions"
|
|
straight-base-dir)))
|
|
(require 'vertico-directory)
|
|
|
|
(with-eval-after-load 'evil
|
|
(define-key vertico-map (kbd "C-j") 'vertico-next)
|
|
(define-key vertico-map (kbd "C-k") 'vertico-previous)
|
|
(define-key vertico-map (kbd "M-h") 'vertico-directory-up))
|
|
|
|
;; Cycle back to top/bottom result when the edge is reached
|
|
(customize-set-variable 'vertico-cycle t)
|
|
|
|
;; Start Vertico
|
|
(vertico-mode 1)
|
|
|
|
|
|
;;; Marginalia
|
|
|
|
;; Configure Marginalia
|
|
(require 'marginalia)
|
|
(customize-set-variable 'marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
|
|
(marginalia-mode 1)
|
|
|
|
;; Set some consult bindings
|
|
(global-set-key (kbd "C-s") 'consult-line)
|
|
(define-key minibuffer-local-map (kbd "C-r") 'consult-history)
|
|
|
|
(setq completion-in-region-function #'consult-completion-in-region)
|
|
|
|
|
|
;;; Orderless
|
|
|
|
;; Set up Orderless for better fuzzy matching
|
|
(require 'orderless)
|
|
(customize-set-variable 'completion-styles '(orderless basic))
|
|
(customize-set-variable 'completion-category-overrides '((file (styles . (partial-completion)))))
|
|
|
|
|
|
;;; Embark
|
|
(require 'embark)
|
|
(require 'embark-consult)
|
|
|
|
(global-set-key [remap describe-bindings] #'embark-bindings)
|
|
(global-set-key (kbd "C-.") 'embark-act)
|
|
|
|
;; Use Embark to show bindings in a key prefix with `C-h`
|
|
(setq prefix-help-command #'embark-prefix-help-command)
|
|
|
|
(with-eval-after-load 'embark-consult
|
|
(add-hook 'embark-collect-mode-hook #'consult-preview-at-point-mode))
|
|
|
|
|
|
;;; Corfu
|
|
(when (eq crafted-package-system 'straight)
|
|
(add-to-list 'load-path
|
|
(expand-file-name "straight/build/corfu/extensions"
|
|
straight-base-dir)))
|
|
(require 'corfu-popupinfo)
|
|
|
|
(require 'corfu)
|
|
|
|
(unless (display-graphic-p)
|
|
(require 'corfu-terminal)
|
|
(corfu-terminal-mode +1))
|
|
|
|
;; Setup corfu for popup like completion
|
|
(customize-set-variable 'corfu-cycle t) ; Allows cycling through candidates
|
|
(customize-set-variable 'corfu-auto t) ; Enable auto completion
|
|
(customize-set-variable 'corfu-auto-prefix 2) ; Complete with less prefix keys
|
|
(customize-set-variable 'corfu-auto-delay 0.0) ; No delay for completion
|
|
(customize-set-variable 'corfu-echo-documentation 0.25) ; Echo docs for current completion option
|
|
|
|
(global-corfu-mode 1)
|
|
(corfu-popupinfo-mode 1)
|
|
(eldoc-add-command #'corfu-insert)
|
|
(define-key corfu-map (kbd "M-p") #'corfu-popupinfo-scroll-down)
|
|
(define-key corfu-map (kbd "M-n") #'corfu-popupinfo-scroll-up)
|
|
(define-key corfu-map (kbd "M-d") #'corfu-popupinfo-toggle)
|
|
|
|
|
|
;;; Cape
|
|
|
|
;; Setup Cape for better completion-at-point support and more
|
|
(require 'cape)
|
|
|
|
;; Add useful defaults completion sources from cape
|
|
(add-to-list 'completion-at-point-functions #'cape-file)
|
|
(add-to-list 'completion-at-point-functions #'cape-dabbrev)
|
|
|
|
;; Silence the pcomplete capf, no errors or messages!
|
|
;; Important for corfu
|
|
(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)
|
|
(add-hook 'eshell-mode-hook
|
|
(lambda () (setq-local corfu-quit-at-boundary t
|
|
corfu-quit-no-match t
|
|
corfu-auto nil)
|
|
(corfu-mode)))
|
|
|
|
(provide 'crafted-completion)
|
|
;;; crafted-completion.el ends here
|