From 08f8f57e2f78bd832ad8ee961174cd15c38085cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Aug 2024 22:43:05 -0400 Subject: [PATCH] feat(corfu): vim-like C-n/C-p keybinds In vim/evil, C-n/C-p invokes dabbrev, so we're doing the same, but powered by cape-dabbrev, falling back to corfu-next/corfu-prev is a corfu popup is already open. Close: #7748 Co-authored-by: 45mg <45mg@users.noreply.github.com> Co-authored-by: LemonBreezes --- modules/completion/corfu/autoload.el | 28 ++++++++++++++++++++++++ modules/config/default/+evil-bindings.el | 2 ++ 2 files changed, 30 insertions(+) diff --git a/modules/completion/corfu/autoload.el b/modules/completion/corfu/autoload.el index 7f01018b2..00852e48c 100644 --- a/modules/completion/corfu/autoload.el +++ b/modules/completion/corfu/autoload.el @@ -60,4 +60,32 @@ (message "Corfu auto-complete %s" (if corfu-auto "disabled" "enabled"))) (setq corfu-auto (not corfu-auto))) +;;;###autoload +(defun +corfu/dabbrev-or-next (&optional arg) + "Trigger corfu popup and select the first candidate. + +Intended to mimic `evil-complete-next', unless the popup is already open." + (interactive "p") + (if corfu--candidates + (corfu-next arg) + (require 'cape) + (let ((cape-dabbrev-check-other-buffers (not evil-complete-all-buffers))) + (cape-dabbrev t) + (when (> corfu--total 0) + (corfu--goto (or arg 0)))))) + +;;;###autoload +(defun +corfu/dabbrev-or-last (&optional arg) + "Trigger corfu popup and select the first candidate. + +Intended to mimic `evil-complete-previous', unless the popup is already open." + (interactive "p") + (if corfu--candidates + (corfu-previous arg) + (require 'cape) + (let ((cape-dabbrev-check-other-buffers (not evil-complete-all-buffers))) + (cape-dabbrev t) + (when (> corfu--total 0) + (corfu--goto (- corfu--total (or arg 1))))))) + ;;; end of autoload.el diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 4e3fa545a..01a9e196d 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -192,6 +192,8 @@ (:after corfu (:map corfu-mode-map :i "C-SPC" #'completion-at-point + :i "C-n" #'+corfu/dabbrev-or-next + :i "C-p" #'+corfu/dabbrev-or-last :n "C-SPC" (cmd! (call-interactively #'evil-insert-state) (call-interactively #'completion-at-point)) :v "C-SPC" (cmd! (call-interactively #'evil-change)