;;;; prompt.lisp -- a function using readlline to collect text from the user ;; Copyright (C) 2022 Colin Okay ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . (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)))