Files
.emacs.d/lisp/init-completion.el
trogloxene c7352d0460 feat: add dashboard and enhance completion
- Add startup dashboard with recent files and bookmarks
- Enhance corfu with icons and minibuffer transfer
- Add avy-zap, markdown-mode, consult-dir
- Optimize GC settings and editor config
2026-04-02 14:56:29 +08:00

119 lines
3.8 KiB
EmacsLisp

;;; init-completion.el --- completion config -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
;; eglot
(use-package eglot
:hook ((python-mode . eglot-ensure))
:config
(setq eglot-send-changes-idle-time 0.25))
;; corfu
(use-package corfu
:autoload (corfu-quit consult-completion-in-region)
:functions (persistent-scratch-save corfu-move-to-minibuffer)
:custom
(corfu-auto t)
(corfu-auto-prefix 2)
(corfu-count 12)
(corfu-preview-current nil)
(corfu-on-exact-match nil)
(corfu-auto-delay 0.2)
(corfu-popupinfo-delay '(0.4 . 0.2))
(global-corfu-modes '((not erc-mode
circe-mode
help-mode
gud-mode
vterm-mode)
t))
:hook ((after-init . global-corfu-mode)
(global-corfu-mode . corfu-popupinfo-mode)
(global-corfu-mode . corfu-history-mode))
:config
;;Quit completion before saving
(add-hook 'before-save-hook #'corfu-quit)
(advice-add #'persistent-scratch-save :before #'corfu-quit)
;; Move completions to minibuffer
(defun corfu-move-to-minibuffer ()
(interactive)
(pcase completion-in-region--data
(`(,beg ,end ,table ,pred ,extras)
(let ((completion-extra-properties extras)
completion-cycle-threshold completion-cycling)
(consult-completion-in-region beg end table pred)))))
(keymap-set corfu-map "M-m" #'corfu-move-to-minibuffer)
(add-to-list 'corfu-continue-commands #'corfu-move-to-minibuffer)
:bind (:map corfu-map
("RET" . nil)))
(unless (or (display-graphic-p)
(featurep 'tty-child-frames))
(use-package corfu-terminal
:hook (global-corfu-mode . corfu-terminal-mode)))
;; 在eshell中使用tab打开补全
(add-hook 'eshell-mode-hook
(lambda ()
(setq-local corfu-auto nil)
(local-set-key (kbd "TAB") 'completion-at-point)))
(use-package nerd-icons-completion
:hook (marginalia-mode . nerd-icons-completion-marginalia-setup))
(use-package emacs
:custom
(tab-always-indent 'complete)
;; Emacs 30 and newer: Disable Ispell completion function.
;; Try `cape-dict' as an alternative.
(text-mode-ispell-word-completion nil)
;; Hide commands in M-x which do not apply to the current mode. Corfu
;; commands are hidden, since they are not used via M-x. This setting is
;; useful beyond Corfu.
(read-extended-command-predicate #'command-completion-default-include-p))
;; cape
(use-package cape
:commands (cape-file cape-elisp-block cape-keyword)
:autoload (cape-wrap-noninterruptible cape-wrap-nonexclusive cape-wrap-buster)
:autoload (cape-wrap-silent)
:init
;; (add-to-list 'completion-at-point-functions #'cape-dabbrev)
(add-to-list 'completion-at-point-functions #'cape-file)
(add-to-list 'completion-at-point-functions #'cape-elisp-block)
(add-to-list 'completion-at-point-functions #'cape-keyword)
;; (add-to-list 'completion-at-point-functions #'cape-abbrev)
;; Make these capfs composable.
(advice-add 'lsp-completion-at-point :around #'cape-wrap-noninterruptible)
(advice-add 'lsp-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'comint-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
(advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive)
(advice-add 'pcomplete-completions-at-point :around #'cape-wrap-nonexclusive))
;; lua
(use-package lua-ts-mode
:mode ("\\.lua\\'" . lua-ts-mode)
:config
(add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-ts-mode)))
;; tree-sitter
(use-package treesit-auto
:demand t
:config
(setq treesit-auto-install 'prompt)
(global-treesit-auto-mode)
(setq treesit-font-lock-level 4))
(provide 'init-completion)
;;; init-completion.el ends here