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

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

[elpa] externals/vertico d0df8c9ce6 3/4: Improve vertico-buffer


From: ELPA Syncer
Subject: [elpa] externals/vertico d0df8c9ce6 3/4: Improve vertico-buffer
Date: Sun, 26 Dec 2021 06:57:48 -0500 (EST)

branch: externals/vertico
commit d0df8c9ce6f4e2d4f47919bcc7edc43b5cf24172
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    Improve vertico-buffer
    
    - Compute vertico-count based on window size
    - Show minibuffer in separate window
    - Add vertico-buffer-hide-prompt
---
 extensions/vertico-buffer.el | 128 +++++++++++++++++++++++--------------------
 1 file changed, 68 insertions(+), 60 deletions(-)

diff --git a/extensions/vertico-buffer.el b/extensions/vertico-buffer.el
index 2e3a89b169..c840fae98d 100644
--- a/extensions/vertico-buffer.el
+++ b/extensions/vertico-buffer.el
@@ -35,12 +35,15 @@
 (require 'vertico)
 
 (defvar-local vertico-buffer--overlay nil)
-(defvar-local vertico-buffer--buffer nil)
+(defvar-local vertico-buffer--window nil)
+
+(defcustom vertico-buffer-hide-prompt t
+  "Hide prompt in the minibuffer."
+  :group 'vertico
+  :type 'boolean)
 
 (defcustom vertico-buffer-display-action
-  `(display-buffer-in-side-window
-    (window-height . ,(+ 3 vertico-count))
-    (side . top))
+  '(display-buffer-reuse-window)
   "Display action for the Vertico buffer."
   :group 'vertico
   :type `(choice
@@ -70,61 +73,66 @@
                   (side . bottom)))
           (sexp :tag "Other")))
 
-(defun vertico-buffer--display (lines)
-  "Display LINES in buffer."
-  (set-window-vscroll nil 100)
-  (let ((count (vertico--format-count))
-        (prompt (minibuffer-prompt))
-        (content (minibuffer-contents)))
-    (with-current-buffer vertico-buffer--buffer
-      (with-silent-modifications
-        (erase-buffer)
-        (insert (propertize (concat count prompt) 'face 'minibuffer-prompt)
-                content "\n" (string-join lines))))
-    (let ((win (or (get-buffer-window vertico-buffer--buffer)
-                   (display-buffer vertico-buffer--buffer 
vertico-buffer-display-action))))
-      (overlay-put vertico--candidates-ov 'window win)
-      (when vertico--count-ov
-        (overlay-put vertico--count-ov 'window win))
-      (set-window-point win (max (+ 1 (length prompt) (length count))
-                                 (+ (point) (length count))))
-      (with-current-buffer vertico-buffer--buffer
-        (setq-local truncate-lines (< (window-point win) (* 0.8 (window-width 
win))))))))
-
-(defun vertico-buffer--select (_)
-  "Ensure that cursor is only shown if minibuffer is selected."
-  (with-current-buffer (buffer-local-value 'vertico-buffer--buffer
-                                           (window-buffer 
(active-minibuffer-window)))
-    (if (eq (selected-window) (active-minibuffer-window))
-        (setq-local cursor-in-non-selected-windows 'box)
-      (setq-local cursor-in-non-selected-windows nil)
-      (goto-char (point-min)))))
-
-(defun vertico-buffer--destroy ()
-  "Destroy Vertico buffer."
-  (set-window-vscroll nil 0)
-  (kill-buffer vertico-buffer--buffer))
+(defun vertico-buffer--redisplay (win)
+  "Redisplay window WIN."
+  (when-let (mbwin (active-minibuffer-window))
+    (when (eq (window-buffer mbwin) (current-buffer))
+      (let ((old cursor-in-non-selected-windows)
+            (new (and (eq (selected-window) mbwin) 'box)))
+        (unless (eq new old)
+          (setq-local cursor-in-non-selected-windows new)
+          (force-mode-line-update t)))
+      (when (eq win vertico-buffer--window)
+        (setq-local truncate-lines (< (window-point vertico-buffer--window)
+                                      (* 0.8 (window-width 
vertico-buffer--window))))
+        (set-window-point vertico-buffer--window (point))
+        (when vertico-buffer-hide-prompt
+          (set-window-vscroll mbwin 100))))))
 
 (defun vertico-buffer--setup ()
   "Setup minibuffer overlay, which pushes the minibuffer content down."
-  (add-hook 'window-selection-change-functions 'vertico-buffer--select nil 
'local)
-  (add-hook 'minibuffer-exit-hook 'vertico-buffer--destroy nil 'local)
-  (setq-local cursor-type '(bar . 0))
-  (setq vertico-buffer--overlay (make-overlay (point-max) (point-max) nil t t))
-  (overlay-put vertico-buffer--overlay 'window (selected-window))
-  (overlay-put vertico-buffer--overlay 'priority 1000)
-  (overlay-put vertico-buffer--overlay 'before-string "\n\n")
-  (setq vertico-buffer--buffer (get-buffer-create
-                                (if (= 1 (recursion-depth))
-                                    " *Vertico*"
-                                  (format " *Vertico-%s*" (1- 
(recursion-depth))))))
-  (with-current-buffer vertico-buffer--buffer
-    (add-hook 'window-selection-change-functions 'vertico-buffer--select nil 
'local)
-    (setq-local display-line-numbers nil
-                truncate-lines t
-                show-trailing-whitespace nil
-                buffer-read-only t
-                cursor-in-non-selected-windows 'box)))
+  (add-hook 'pre-redisplay-functions 'vertico-buffer--redisplay nil 'local)
+  (let ((temp (generate-new-buffer "*vertico*")))
+    (setq vertico-buffer--window (display-buffer temp 
vertico-buffer-display-action))
+    (set-window-buffer vertico-buffer--window (current-buffer))
+    (kill-buffer temp))
+  (let ((sym (make-symbol "vertico-buffer--destroy"))
+        (mbwin (active-minibuffer-window))
+        (depth (recursion-depth))
+        (now (window-parameter vertico-buffer--window 'no-other-window))
+        (ndow (window-parameter vertico-buffer--window 
'no-delete-other-windows)))
+    (fset sym (lambda ()
+                (when (= depth (recursion-depth))
+                  (when (window-live-p vertico-buffer--window)
+                    (set-window-parameter vertico-buffer--window 
'no-other-window now)
+                    (set-window-parameter vertico-buffer--window 
'no-delete-other-windows ndow))
+                  (when vertico-buffer-hide-prompt
+                    (set-window-vscroll mbwin 0))
+                  (remove-hook 'minibuffer-exit-hook sym))))
+    ;; NOTE: We cannot use a buffer-local minibuffer-exit-hook here.
+    ;; The hook will not be called when abnormally exiting the minibuffer
+    ;; from another buffer via `keyboard-escape-quit'.
+    (add-hook 'minibuffer-exit-hook sym))
+  (set-window-parameter vertico-buffer--window 'no-other-window t)
+  (set-window-parameter vertico-buffer--window 'no-delete-other-windows t)
+  (when vertico-buffer-hide-prompt
+    (overlay-put vertico--candidates-ov 'window vertico-buffer--window)
+    (when vertico--count-ov
+      (overlay-put vertico--count-ov 'window vertico-buffer--window))
+    (setq vertico-buffer--overlay (make-overlay (point-max) (point-max) nil t 
t))
+    (overlay-put vertico-buffer--overlay 'window (selected-window))
+    (overlay-put vertico-buffer--overlay 'priority 1000)
+    (overlay-put vertico-buffer--overlay 'before-string "\n\n"))
+  (setq-local show-trailing-whitespace nil
+              truncate-lines t
+              mode-line-format
+              (list (format " %s %s "
+                            (propertize "*Vertico*" 'face 'bold)
+                            (string-remove-suffix ": " (minibuffer-prompt)))
+                    '(:eval (vertico--format-count)))
+              cursor-in-non-selected-windows 'box
+              vertico-count (- (/ (window-pixel-height vertico-buffer--window)
+                                  (default-line-height)) 2)))
 
 ;;;###autoload
 (define-minor-mode vertico-buffer-mode
@@ -132,11 +140,11 @@
   :global t :group 'vertico
   (cond
    (vertico-buffer-mode
-    (advice-add #'vertico--display-candidates :override 
#'vertico-buffer--display)
-    (advice-add #'vertico--setup :after #'vertico-buffer--setup))
+    (advice-add #'vertico--setup :after #'vertico-buffer--setup)
+    (advice-add #'vertico--resize-window :override #'ignore))
    (t
-    (advice-remove #'vertico--display-candidates #'vertico-buffer--display)
-    (advice-remove #'vertico--setup #'vertico-buffer--setup))))
+    (advice-remove #'vertico--setup #'vertico-buffer--setup)
+    (advice-remove #'vertico--resize-window #'ignore))))
 
 (provide 'vertico-buffer)
 ;;; vertico-buffer.el ends here



reply via email to

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