emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/corfu 0203139e53 1/3: corfu-popupinfo: Improve toggles


From: ELPA Syncer
Subject: [elpa] externals/corfu 0203139e53 1/3: corfu-popupinfo: Improve toggles
Date: Sat, 19 Nov 2022 12:57:26 -0500 (EST)

branch: externals/corfu
commit 0203139e5341c7203b88e8aa9b51c1ab0e1186d1
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    corfu-popupinfo: Improve toggles
---
 extensions/corfu-info.el      |  2 +-
 extensions/corfu-popupinfo.el | 54 ++++++++++++++++++++++++-------------------
 2 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/extensions/corfu-info.el b/extensions/corfu-info.el
index dfe9d58a97..c9bf1b96a3 100644
--- a/extensions/corfu-info.el
+++ b/extensions/corfu-info.el
@@ -87,7 +87,7 @@
               (goto-char (point-min))
               (forward-line (1- (cdr loc))))
             (set-window-start nil (point)))))
-    (user-error "No candidate location available")))
+    (user-error "Location is unknown")))
 
 ;; Emacs 28: Do not show Corfu commands with M-X
 (put #'corfu-info-location 'completion-predicate #'ignore)
diff --git a/extensions/corfu-popupinfo.el b/extensions/corfu-popupinfo.el
index b4729530ad..77beac627d 100644
--- a/extensions/corfu-popupinfo.el
+++ b/extensions/corfu-popupinfo.el
@@ -112,7 +112,7 @@ popup can be requested manually via 
`corfu-popupinfo-toggle',
     (fringe-indicator-alist (continuation)))
   "Buffer parameters.")
 
-(defvar-local corfu-popupinfo--toggle t
+(defvar-local corfu-popupinfo--toggle 'init
   "Local toggle state.")
 
 (defvar-local corfu-popupinfo--function
@@ -154,7 +154,8 @@ all values are in pixels relative to the origin. See
   "Get source at location of CANDIDATE."
   (save-excursion
     (when-let* ((fun (plist-get corfu--extra :company-location))
-                (loc (funcall fun candidate))
+                ;; BUG: company-location may throw errors if location is not 
found
+                (loc (ignore-errors (funcall fun candidate)))
                 (res (or (and (bufferp (car loc)) (car loc))
                          (find-file-noselect (car loc) t))))
       (with-current-buffer res
@@ -327,8 +328,14 @@ the candidate popup, its value is 'bottom, 'top, 'right or 
'left."
                 (set (make-local-variable (car var)) (cdr var)))
               (setf face-remapping-alist (copy-tree face-remapping-alist)
                     (alist-get 'default face-remapping-alist) 
'corfu-popupinfo))
+          (unless (eq corfu-popupinfo--toggle 'init)
+            (message
+             ;; TODO support custom functions, don't hard code the error!
+             (if (eq corfu-popupinfo--function 
#'corfu-popupinfo--get-documentation)
+                 "No documentation available"
+               "Location is unknown")))
           (corfu-popupinfo--hide)
-          (setq doc-changed nil coords-changed nil)))
+          (setq doc-changed nil coords-changed nil corfu-popupinfo--toggle 
nil)))
       (when (or doc-changed coords-changed)
         (pcase-let* ((border (alist-get 'child-frame-border-width 
corfu--frame-parameters))
                      (`(,area-x ,area-y ,area-w ,area-h ,area-d)
@@ -369,25 +376,31 @@ If ARG is omitted or nil, scroll down by a near full 
screen."
   (interactive "p")
   (corfu-popupinfo-scroll-up (- (or n 1))))
 
-(defun corfu-popupinfo--set-function (fun)
-  "Set popup documentation getter FUN."
-  (setq corfu-popupinfo--function fun
-        corfu-popupinfo--candidate nil
-        corfu-popupinfo--toggle nil)
-  (when-let (candidate (and (>= corfu--index 0)
-                            (nth corfu--index corfu--candidates)))
-    (setq corfu-popupinfo--toggle t)
-    (corfu-popupinfo--show candidate)))
+(defun corfu-popupinfo--toggle (fun)
+  "Set documentation getter FUN and toggle popup."
+  (when (< corfu--index 0)
+    (corfu-popupinfo--hide)
+    (user-error "No candidate selected"))
+  (setq corfu-popupinfo--toggle
+        (not (and (corfu-popupinfo--visible-p)
+                  (eq corfu-popupinfo--function fun))))
+  (if (not corfu-popupinfo--toggle)
+      (corfu-popupinfo--hide)
+    (setq corfu-popupinfo--function fun
+          corfu-popupinfo--candidate nil)
+    (corfu-popupinfo--show (nth corfu--index corfu--candidates))))
 
 (defun corfu-popupinfo-documentation ()
-  "Show documentation in popup."
+  "Show or hide documentation in popup.
+Behaves like `corfu-popupinfo-toggle'."
   (interactive)
-  (corfu-popupinfo--set-function #'corfu-popupinfo--get-documentation))
+  (corfu-popupinfo--toggle #'corfu-popupinfo--get-documentation))
 
 (defun corfu-popupinfo-location ()
-  "Show location in popup."
+  "Show or hide location in popup.
+Behaves like `corfu-popupinfo-toggle'."
   (interactive)
-  (corfu-popupinfo--set-function #'corfu-popupinfo--get-location))
+  (corfu-popupinfo--toggle #'corfu-popupinfo--get-location))
 
 (defun corfu-popupinfo-toggle ()
   "Toggle the info popup display or hide.
@@ -396,14 +409,7 @@ When using this command to manually hide the info popup, 
it will
 not be displayed until this command is called again, even if
 `corfu-popupinfo-delay' is non-nil."
   (interactive)
-  (setq corfu-popupinfo--toggle nil)
-  (if-let ((candidate (and (>= corfu--index 0)
-                          (nth corfu--index corfu--candidates)))
-           ((not (corfu-popupinfo--visible-p))))
-      (progn
-        (setq corfu-popupinfo--toggle t)
-        (corfu-popupinfo--show candidate))
-    (corfu-popupinfo--hide)))
+  (corfu-popupinfo--toggle corfu-popupinfo--function))
 
 (defun corfu-popupinfo--exhibit (&rest _)
   "Update the info popup automatically."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]