branch: externals/corfu
commit 36f51adb3dbbdefe057cbab8747bdaed2c10c7f2
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>
Simplify state management
---
corfu.el | 77 ++++++++++++++++++++++++++++------------------------------------
1 file changed, 34 insertions(+), 43 deletions(-)
diff --git a/corfu.el b/corfu.el
index 58383b0..0a8c6f4 100644
--- a/corfu.el
+++ b/corfu.el
@@ -120,28 +120,28 @@ Set to nil in order to disable confirmation."
map)
"Corfu keymap used when popup is shown.")
-(defvar-local corfu--candidates nil
+(defvar corfu--candidates nil
"List of candidates.")
-(defvar-local corfu--base 0
+(defvar corfu--base 0
"Size of the base string, which is concatenated with the candidate.")
-(defvar-local corfu--total 0
+(defvar corfu--total 0
"Length of the candidate list `corfu--candidates'.")
-(defvar-local corfu--highlight #'identity
+(defvar corfu--highlight #'identity
"Deferred candidate highlighting function.")
-(defvar-local corfu--index -1
+(defvar corfu--index -1
"Index of current candidate or negative for prompt selection.")
-(defvar-local corfu--input nil
+(defvar corfu--input nil
"Cons of last prompt contents and point or t.")
-(defvar-local corfu--overlay nil
+(defvar corfu--overlay nil
"Current candidate overlay.")
-(defvar-local corfu--extra-properties nil
+(defvar corfu--extra-properties nil
"Extra completion properties.")
(defvar corfu--frame nil
@@ -152,17 +152,6 @@ Set to nil in order to disable confirmation."
"\\`\\(nil\\|completion-at-point\\|corfu-.*\\|scroll-other-window.*\\)\\'"
"Keep Corfu popup alive during commands matching this regexp.")
-(defconst corfu--state-vars
- '(corfu--base
- corfu--candidates
- corfu--highlight
- corfu--index
- corfu--input
- corfu--total
- corfu--overlay
- corfu--extra-properties)
- "Buffer-local state variables used by Corfu.")
-
;; Function adapted from posframe.el by tumashu
(defun corfu--child-frame (x y width height content)
"Show child frame at X/Y with WIDTH/HEIGHT and CONTENT."
@@ -407,6 +396,8 @@ Set to nil in order to disable confirmation."
(cands (funcall corfu--highlight (seq-subseq corfu--candidates start
last)))
(ann-cands (mapcar #'corfu--format-candidate (corfu--annotate
metadata cands))))
(when (>= curr 0)
+ (when corfu--overlay
+ (delete-overlay corfu--overlay))
(setq corfu--overlay (make-overlay beg end nil t t))
(overlay-put corfu--overlay 'priority 1000)
(overlay-put corfu--overlay 'window (selected-window))
@@ -458,29 +449,18 @@ Set to nil in order to disable confirmation."
(defun corfu--pre-command-hook ()
"Insert selected candidate unless keep alive command."
- (add-hook 'window-configuration-change-hook #'corfu--hide)
- (when corfu--overlay
- (delete-overlay corfu--overlay)
- (setq corfu--overlay nil))
+ (add-hook 'window-configuration-change-hook #'corfu-abort)
(unless (or (< corfu--index 0) (corfu--keep-alive-p))
(corfu--insert 'exact)))
-(defun corfu--hide ()
- "Hide Corfu popup."
- (when (frame-live-p corfu--frame)
- (make-frame-invisible corfu--frame)
- (with-current-buffer (window-buffer (frame-root-window corfu--frame))
- (erase-buffer)))
- (remove-hook 'window-configuration-change-hook #'corfu--hide))
-
(defun corfu--post-command-hook ()
"Refresh Corfu after last command."
- (remove-hook 'window-configuration-change-hook #'corfu--hide)
+ (remove-hook 'window-configuration-change-hook #'corfu-abort)
(or (pcase completion-in-region--data
(`(,beg ,end ,_table ,_pred)
(when (and (eq (marker-buffer beg) (current-buffer)) (<= beg (point)
end))
(corfu--update))))
- (completion-in-region-mode -1)))
+ (corfu-abort)))
(defun corfu--goto (index)
"Go to candidate with INDEX."
@@ -611,29 +591,40 @@ Set to nil in order to disable confirmation."
;; XXX Is the :exit-function handling sufficient?
(when-let (exit (plist-get corfu--extra-properties :exit-function))
(funcall exit str status))
- (completion-in-region-mode -1))
+ (corfu-abort))
(defun corfu-insert ()
"Insert current candidate."
(interactive)
(if (> corfu--total 0)
(corfu--insert 'finished)
- (completion-in-region-mode -1)))
+ (corfu-abort)))
(defun corfu--setup ()
"Setup Corfu completion state."
(setq corfu--extra-properties completion-extra-properties)
(setcdr (assq #'completion-in-region-mode minor-mode-overriding-map-alist)
corfu-map)
- (add-hook 'pre-command-hook #'corfu--pre-command-hook nil 'local)
- (add-hook 'post-command-hook #'corfu--post-command-hook nil 'local))
+ (add-hook 'pre-command-hook #'corfu--pre-command-hook)
+ (add-hook 'post-command-hook #'corfu--post-command-hook))
(defun corfu--teardown ()
"Teardown Corfu."
- (corfu--hide)
- (remove-hook 'pre-command-hook #'corfu--pre-command-hook 'local)
- (remove-hook 'post-command-hook #'corfu--post-command-hook 'local)
+ (when (frame-live-p corfu--frame)
+ (make-frame-invisible corfu--frame)
+ (with-current-buffer (window-buffer (frame-root-window corfu--frame))
+ (erase-buffer)))
+ (remove-hook 'window-configuration-change-hook #'corfu-abort)
+ (remove-hook 'pre-command-hook #'corfu--pre-command-hook)
+ (remove-hook 'post-command-hook #'corfu--post-command-hook)
(when corfu--overlay (delete-overlay corfu--overlay))
- (mapc #'kill-local-variable corfu--state-vars))
+ (setq corfu--candidates nil
+ corfu--base 0
+ corfu--total 0
+ corfu--highlight #'identity
+ corfu--index -1
+ corfu--input nil
+ corfu--overlay nil
+ corfu--extra-properties nil))
(defun corfu--mode-hook ()
"Corfu mode hook."
@@ -655,10 +646,10 @@ Set to nil in order to disable confirmation."
(define-minor-mode corfu-mode
"Completion Overlay Region FUnction"
:global nil
- (remove-hook 'completion-in-region-mode-hook #'corfu--mode-hook 'local)
+ (remove-hook 'completion-in-region-mode-hook #'corfu--mode-hook)
(kill-local-variable 'completion-in-region-function)
(when corfu-mode
- (add-hook 'completion-in-region-mode-hook #'corfu--mode-hook nil 'local)
+ (add-hook 'completion-in-region-mode-hook #'corfu--mode-hook)
(setq-local completion-in-region-function #'corfu--completion-in-region)))
;;;###autoload