;;; init-completion.el --- Completion Configuration File -*- lexical-binding: t -*- ;;; Commentary: ;; Config for completion-at-point (corfu), as well as orderless (see also init-minibuffer.el) ;; Most of it is taken from the READMEs and wikis of those packages ;;; Code: (use-package dabbrev :diminish :custom (dabbrev-case-fold-search nil) :bind ("M-/" . dabbrev-completion)) (use-package hippie-expand :ensure nil :init (setq hippie-expand-try-functions-list '(;yas-hippie-try-expand try-expand-dabbrev try-expand-all-abbrevs try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-file-name-partially try-complete-file-name try-expand-list try-expand-line try-complete-lisp-symbol-partially try-complete-lisp-symbol)) :bind ("C-M-/" . hippie-expand)) (use-package fancy-dabbrev :diminish :config (global-fancy-dabbrev-mode)) (use-package emacs :init (setq completion-cycle-threshold 3) (setq tab-always-indent 'complete)) (use-package orderless :bind (:map minibuffer-local-completion-map ("C-l" . my/orderless-match-components-literally)) :custom (orderless-component-separator 'orderless-escapable-split-on-space) :init (setq completion-styles '(orderless basic) completion-category-defaults nil completion-category-overrides '((file (styles . (partial-completion orderless))))) (defun my/orderless-match-components-literally () "Components match literally for the rest of the session." (interactive) (setq-local orderless-matching-styles '(orderless-literal) orderless-style-dispatchers nil)) :config ;; Recognizes the following patterns: ;; * ~flex flex~ ;; * =literal literal= ;; * %char-fold char-fold% ;; * `initialism initialism` ;; * !without-literal without-literal! ;; * .ext (file extension) ;; * regexp$ (regexp matching at end) (defun my/orderless-dispatch (pattern _index _total) (cond ;; Ensure that $ works with Consult commands, which add disambiguation suffixes ((string-suffix-p "$" pattern) `(orderless-regexp . ,(concat (substring pattern 0 -1) "[\x100000-\x10FFFD]*$"))) ;; File extensions ((string-match-p "\\`\\.." pattern) `(orderless-regexp . ,(concat "\\." (substring pattern 1) "[\x100000-\x10FFFD]*$"))) ;; Ignore single ! ((string= "!" pattern) `(orderless-literal . "")) ;; Character folding ((string-prefix-p "%" pattern) `(char-fold-to-regexp . ,(substring pattern 1))) ((string-suffix-p "%" pattern) `(char-fold-to-regexp . ,(substring pattern 0 -1))) ;; Without literal ((string-prefix-p "!" pattern) `(orderless-without-literal . ,(substring pattern 1))) ((string-suffix-p "!" pattern) `(orderless-without-literal . ,(substring pattern 0 -1))) ;; Initialism matching ((string-prefix-p "`" pattern) `(orderless-initialism . ,(substring pattern 1))) ((string-suffix-p "`" pattern) `(orderless-initialism . ,(substring pattern 0 -1))) ;; Literal matching ((string-prefix-p "=" pattern) `(orderless-literal . ,(substring pattern 1))) ((string-suffix-p "=" pattern) `(orderless-literal . ,(substring pattern 0 -1))) ;; Flex matching ((string-prefix-p "~" pattern) `(orderless-flex . ,(substring pattern 1))) ((string-suffix-p "~" pattern) `(orderless-flex . ,(substring pattern 0 -1))))) ;; (setq orderless-matching-styles '(orderless-literal orderless-regexp orderless-strict-leading-initialism) ;; orderless-style-dispatchers '(my/orderless-dispatch)) (setq orderless-matching-styles '(orderless-literal orderless-regexp orderless-initialism) orderless-style-dispatchers '(my/orderless-dispatch))) ;; code completion - corfu (use-package corfu ;; Optional customizations :custom (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' :bind (:map corfu-map ("TAB" . corfu-next) ([tab] . corfu-next) ("S-TAB" . corfu-previous) ([backtab] . corfu-previous)) :init (global-corfu-mode)) (use-package corfu-doc :config (add-hook 'corfu-mode-hook #'corfu-doc-mode)) (provide 'init-completion) ;;; init-completion.el ends here