;;; wg-commands-minibuffer --- minibuffer commands ;;; Commentary: ;;; Code: (require 'workgroups-utils-basic) (require 'workgroups-buf) (defvar wg-just-exited-minibuffer nil "Flag set by `minibuffer-exit-hook'. To exempt from undoification those window-configuration changes caused by exiting the minibuffer. This is ugly, but necessary. It may seem like we could just null out `wg-undoify-window-configuration-change' in `minibuffer-exit-hook', but that also prevents undoification of window configuration changes triggered by commands called with `execute-extended-command' -- i.e. it's just too coarse.") (defcustom wg-no-confirm-on-destructive-operation nil "Do not request confirmation before various destructive operations. Like `wg-reset'." :type 'boolean :group 'workgroups) (defcustom wg-minibuffer-message-timeout 0.75 "Bound to `minibuffer-message-timeout' when messaging while the minibuffer is active." :type 'float :group 'workgroups) ;; ;; Functions ;; (defun wg-read-object (prompt test warning &optional initial-contents keymap read hist default-value inherit-input-method) "PROMPT for an object that satisfies TEST. WARNING if necessary. INITIAL-CONTENTS KEYMAP READ HIST DEFAULT-VALUE INHERIT-INPUT-METHOD are `read-from-minibuffer's args." (cl-labels ((read () (read-from-minibuffer prompt initial-contents keymap read hist default-value inherit-input-method))) (let ((obj (read))) (when (and (equal obj "") default-value) (setq obj default-value)) (while (not (funcall test obj)) (message warning) (sit-for wg-minibuffer-message-timeout) (setq obj (read))) obj))) (defun wg-read-new-workgroup-name (&optional prompt) "Read a non-empty name string from the minibuffer. Print PROMPT" (let ((default (wg-new-default-workgroup-name))) (wg-read-object (or prompt (format "Name (default: %S): " default)) (lambda (new) (and (stringp new) (not (equal new "")) (wg-unique-workgroup-name-p new))) "Please enter a unique, non-empty name" nil nil nil nil default))) (defun wg-read-workgroup-index () "Prompt for the index of a workgroup." (let ((max (1- (length (wg-workgroup-list-or-error))))) (wg-read-object (format "%s\n\nEnter [0-%d]: " (wg-workgroup-list-display) max) (lambda (obj) (and (integerp obj) (wg-within obj 0 max t))) (format "Please enter an integer [%d-%d]" 0 max) nil nil t))) (defun wg-minibuffer-inactive-p () "Return t when `minibuffer-depth' is zero, nil otherwise." (zerop (minibuffer-depth))) (defun wg-barf-on-active-minibuffer () "Throw an error when the minibuffer is active." (when (not (wg-minibuffer-inactive-p)) (error "Exit minibuffer to use workgroups functions!"))) (provide 'workgroups-minibuffer) ;;; workgroups-minibuffer.el ends here