;;;; prompt.lisp -- a function using readlline to collect text from the user (defpackage #:oneliners.cli.prompt (:use #:cl) (:local-nicknames (#:rl #:cl-readline)) (:export #:prompt)) (in-package :oneliners.cli.prompt) (defun prompt (prompt &key (expect (constantly t)) retry-text (prefill "")) ;; register a prefill hook (rl:register-hook :pre-input (lambda () (rl:insert-text prefill) (rl:redisplay))) (unwind-protect (loop with prompt-text = prompt with should-retry-p = t while should-retry-p for line = (rl:readline :prompt prompt-text) when (funcall expect line) do (setf should-retry-p nil) when retry-text do (setf prompt-text retry-text) finally (return line)) ;; unregisters the hook. (rl:register-hook :pre-input nil)))