[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/vertico a92b1e47ff: vertico-repeat extension: Add verti
From: |
ELPA Syncer |
Subject: |
[elpa] externals/vertico a92b1e47ff: vertico-repeat extension: Add vertico-repeat-select (Fix #182) |
Date: |
Mon, 21 Mar 2022 09:57:59 -0400 (EDT) |
branch: externals/vertico
commit a92b1e47ffe343e2c3096e2ea61af013a8a02af9
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>
vertico-repeat extension: Add vertico-repeat-select (Fix #182)
---
extensions/vertico-repeat.el | 147 +++++++++++++++++++++++++++++--------------
1 file changed, 99 insertions(+), 48 deletions(-)
diff --git a/extensions/vertico-repeat.el b/extensions/vertico-repeat.el
index 4840f108da..1e73b31123 100644
--- a/extensions/vertico-repeat.el
+++ b/extensions/vertico-repeat.el
@@ -1,4 +1,4 @@
-;;; vertico-repeat.el --- Repeat the last Vertico session -*- lexical-binding:
t -*-
+;;; vertico-repeat.el --- Repeat Vertico sessions -*- lexical-binding: t -*-
;; Copyright (C) 2021, 2022 Free Software Foundation, Inc.
@@ -27,70 +27,121 @@
;;; Commentary:
;; This package is a Vertico extension, which enables repetition of the
-;; last Vertico session via the `vertico-repeat' command.
-;;
-;; (global-set-key "\M-r" #'vertico-repeat)
-;;
-;; It is necessary to register a minibuffer setup hook, which saves the
-;; Vertico state for repetition.
+;; Vertico sessions via the `vertico-repeat-last' and
+;; `vertico-repeat-select' commands. It is necessary to register a
+;; minibuffer setup hook, which saves the Vertico state for repetition.
;;
+;; (global-set-key "\M-r" #'vertico-repeat-last)
+;; (global-set-key "\M-R" #'vertico-repeat-select)
;; (add-hook 'minibuffer-setup-hook #'vertico-repeat-save)
;;; Code:
(require 'vertico)
+(eval-when-compile (require 'cl-lib))
-(defvar-local vertico-repeat--restore nil)
-(defvar vertico-repeat--input nil)
-(defvar vertico-repeat--command nil)
-(defvar vertico-repeat--candidate nil)
+(defcustom vertico-repeat-filter
+ '(vertico-repeat-select
+ execute-extended-command
+ execute-extended-command-for-buffer)
+ "List of commands to filter out from the history."
+ :type '(repeat symbol)
+ :group 'vertico)
+
+(defvar vertico-repeat--history nil)
+(defvar-local vertico-repeat--command nil)
+(defvar-local vertico-repeat--input nil)
(defun vertico-repeat--save-input ()
- "Save current minibuffer content for `vertico-repeat'."
+ "Save current minibuffer input."
(setq vertico-repeat--input (minibuffer-contents)))
-(defun vertico-repeat--save-candidate ()
- "Save currently selected candidate for `vertico-repeat'."
- (setq vertico-repeat--candidate
- (and vertico--lock-candidate
- (>= vertico--index 0)
- (nth vertico--index vertico--candidates))))
-
-(defun vertico-repeat--restore ()
- "Restore Vertico status for `vertico-repeat'."
- (setq vertico-repeat--restore t)
+(defun vertico-repeat--save-exit ()
+ "Save command session in `vertico-repeat--history'."
+ (add-to-history
+ 'vertico-repeat--history
+ (list
+ vertico-repeat--command
+ vertico-repeat--input
+ (and vertico--lock-candidate
+ (>= vertico--index 0)
+ (nth vertico--index vertico--candidates)))))
+
+(defun vertico-repeat--restore (session)
+ "Restore Vertico SESSION for `vertico-repeat'."
(delete-minibuffer-contents)
- (insert vertico-repeat--input)
- (when vertico-repeat--candidate
- (run-at-time 0 nil
- (lambda ()
- (when-let (idx (seq-position vertico--candidates
vertico-repeat--candidate))
- (setq vertico--index idx
- vertico--lock-candidate t)
- (vertico--exhibit))))))
-
-;;;###autoload
-(defun vertico-repeat ()
- "Repeat last Vertico completion session."
- (interactive)
- (unless vertico-repeat--command
- (user-error "No repeatable Vertico session"))
- (minibuffer-with-setup-hook
- #'vertico-repeat--restore
- (command-execute (setq this-command vertico-repeat--command))))
+ (insert (cadr session))
+ (when (caddr session)
+ (vertico--exhibit)
+ (when-let (idx (seq-position vertico--candidates (caddr session)))
+ (setq vertico--index idx
+ vertico--lock-candidate t)
+ (vertico--exhibit))))
;;;###autoload
(defun vertico-repeat-save ()
- "Save Vertico status for `vertico-repeat'.
+ "Save Vertico session for `vertico-repeat'.
This function must be registered as `minibuffer-setup-hook'."
- (when vertico--input
- (unless vertico-repeat--restore
- (setq vertico-repeat--command this-command
- vertico-repeat--input ""
- vertico-repeat--candidate nil
- vertico-repeat--restore nil))
+ (when (and vertico--input (not (memq this-command vertico-repeat-filter)))
+ (setq vertico-repeat--command this-command)
(add-hook 'post-command-hook #'vertico-repeat--save-input nil 'local)
- (add-hook 'minibuffer-exit-hook #'vertico-repeat--save-candidate nil
'local)))
+ (add-hook 'minibuffer-exit-hook #'vertico-repeat--save-exit nil 'local)))
+
+;;;###autoload
+(defun vertico-repeat-last (&optional session)
+ "Repeat last Vertico completion SESSION."
+ (interactive
+ (list (or (car vertico-repeat--history)
+ (user-error "No repeatable Vertico session"))))
+ (minibuffer-with-setup-hook
+ (apply-partially #'vertico-repeat--restore session)
+ (command-execute (setq this-command (car session)))))
+
+(defun vertico-repeat-select ()
+ "Select a session from the last Vertico sessions and repeat it."
+ (interactive)
+ (let* ((trimmed
+ (delete-dups
+ (or
+ (cl-loop
+ for session in vertico-repeat--history collect
+ (list
+ (symbol-name (car session))
+ (replace-regexp-in-string
+ "\\s-+" " "
+ (string-trim (cadr session)))
+ (if (caddr session)
+ (replace-regexp-in-string
+ "\\s-+" " "
+ (string-trim (caddr session)))
+ "")
+ session))
+ (user-error "No repeatable Vertico session"))))
+ (max-cmd (cl-loop for (cmd . _) in trimmed
+ maximize (string-width cmd)))
+ (max-input (cl-loop for (_cmd input . _) in trimmed
+ maximize (string-width input)))
+ (formatted (cl-loop
+ for (cmd input cand session) in trimmed collect
+ (cons
+ (concat
+ (propertize cmd 'face 'font-lock-function-name-face)
+ (make-string (- max-cmd (string-width cmd) -4) ?\s)
+ (propertize input 'face 'font-lock-string-face)
+ (make-string (- max-input (string-width input) -4) ?\s)
+ (and cand (propertize cand 'face
'font-lock-comment-face)))
+ session)))
+ (selected (or (cdr (assoc (completing-read
+ "History: "
+ (lambda (str pred action)
+ (if (eq action 'metadata)
+ '(metadata (display-sort-function .
identity)
+ (cycle-sort-function .
identity))
+ (complete-with-action action formatted
str pred)))
+ nil t nil t)
+ formatted))
+ (user-error "No session selected"))))
+ (vertico-repeat-last selected)))
(provide 'vertico-repeat)
;;; vertico-repeat.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/vertico a92b1e47ff: vertico-repeat extension: Add vertico-repeat-select (Fix #182),
ELPA Syncer <=