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

    vertico-multiform-mode: Add context menu to change display mode
    
    First enable `vertico-multiform-mode' and `context-menu-mode'. The menu will
    appear with a right click in the Vertico minibuffer.
---
 CHANGELOG.org                   |  6 ++++++
 extensions/vertico-mouse.el     |  1 +
 extensions/vertico-multiform.el | 33 ++++++++++++++++++++-------------
 3 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/CHANGELOG.org b/CHANGELOG.org
index 29a60a1021..6314d23ac2 100644
--- a/CHANGELOG.org
+++ b/CHANGELOG.org
@@ -2,6 +2,12 @@
 #+author: Daniel Mendler
 #+language: en
 
+* Development
+
+- =vertico-multiform-mode=: Add context menu to change display mode. First 
enable
+  =vertico-multiform-mode= and =context-menu-mode=. The menu will appear with a
+  right click in the Vertico minibuffer.
+
 * Version 2.2 (2025-05-26)
 
 - Guard Vertico hooks to automatically print stack traces in order to ease
diff --git a/extensions/vertico-mouse.el b/extensions/vertico-mouse.el
index b4218272b1..6a39e984de 100644
--- a/extensions/vertico-mouse.el
+++ b/extensions/vertico-mouse.el
@@ -56,6 +56,7 @@
 (defvar-keymap vertico-mouse-map
   :doc "Additional keymap activated in mouse mode."
   "<mouse-1>" (vertico-mouse--click "RET")
+  "<mouse-2>" (vertico-mouse--click "TAB")
   "<mouse-3>" (vertico-mouse--click "TAB"))
 (fset 'vertico-mouse-map vertico-mouse-map)
 
diff --git a/extensions/vertico-multiform.el b/extensions/vertico-multiform.el
index 87d7f67ec7..6e62e098cb 100644
--- a/extensions/vertico-multiform.el
+++ b/extensions/vertico-multiform.el
@@ -146,14 +146,26 @@ The keys in LIST can be symbols or regexps."
   "Configure Vertico in various forms per command."
   :global t :group 'vertico
   (when (/= (recursion-depth) 0)
-    (warn "vertico-multiform must not be toggled from recursive minibuffers"))
+    (warn "Vertico multiform must not be toggled from recursive minibuffers"))
   (when vertico-multiform--stack
-    (warn "vertico-multiform state is inconsistent")
+    (warn "Vertico multiform state is inconsistent")
     (setq vertico-multiform--stack nil))
+  (remove-hook 'context-menu-functions #'vertico-multiform--display-menu)
   (cl-callf2 rassq-delete-all vertico-multiform-map minor-mode-map-alist)
   (when vertico-multiform-mode
+    (add-hook 'context-menu-functions #'vertico-multiform--display-menu)
     (push `(vertico--input . ,vertico-multiform-map) minor-mode-map-alist)))
 
+(defvar vertico-multiform--display-modes nil)
+(defvar-local vertico-multiform--display-last nil)
+
+(defun vertico-multiform--display-menu (menu _event)
+  "Add Vertico display modes to MENU."
+  (when vertico--input
+    (define-key menu [vertico-multiform--display-menu]
+                `(menu-item "Vertico Display" ,vertico-multiform-map)))
+  menu)
+
 (cl-defmethod vertico--advice (&context (vertico-multiform-mode (eql t)) &rest 
app)
   (unwind-protect
       (progn
@@ -183,9 +195,6 @@ ARG can be nil, t, -1, 1 or toggle."
           (setcar vertico-multiform--stack (remove mode modes))
         (push not-mode (car vertico-multiform--stack))))))
 
-(defvar vertico-multiform--display-modes nil)
-(defvar-local vertico-multiform--display-last nil)
-
 (defun vertico-multiform-vertical (&optional mode)
   "Toggle to display MODE temporarily in minibuffer.
 MODE defaults to the vertical display."
@@ -201,13 +210,10 @@ MODE defaults to the vertical display."
       (vertico-multiform--temporary-mode mode 1))
     (setq vertico-multiform--display-last last)))
 
-(pcase-dolist (`(,key ,name) '(("M-B" buffer)
-                               ("M-F" flat)
-                               ("M-G" grid)
-                               ("M-R" reverse)
-                               ("M-U" unobtrusive) ;; must come after flat
-                               ("M-V" vertical)))
-  (let ((toggle (intern (format "vertico-multiform-%s" name))))
+;; unobtrusive must come after flat
+(dolist (name '(buffer flat grid reverse unobtrusive vertical))
+  (let ((toggle (intern (format "vertico-multiform-%s" name)))
+        (label (capitalize (symbol-name name))))
     (unless (eq name 'vertical)
       (let ((mode (intern (format "vertico-%s-mode" name))))
         (defalias toggle
@@ -215,7 +221,8 @@ MODE defaults to the vertical display."
           (format "Toggle the %s display." name))
         (push mode vertico-multiform--display-modes)))
     (put toggle 'completion-predicate #'vertico--command-p)
-    (keymap-set vertico-multiform-map key toggle)))
+    (define-key vertico-multiform-map (vector toggle) (cons label toggle))
+    (keymap-set vertico-multiform-map (format "M-%c" (aref label 0)) toggle)))
 
 (provide 'vertico-multiform)
 ;;; vertico-multiform.el ends here

Reply via email to