1 ;; Copyright (c) 2003 Nikodemus Siivola
3 ;; Permission is hereby granted, free of charge, to any person obtaining
4 ;; a copy of this software and associated documentation files (the
5 ;; "Software"), to deal in the Software without restriction, including
6 ;; without limitation the rights to use, copy, modify, merge, publish,
7 ;; distribute, sublicense, and/or sell copies of the Software, and to
8 ;; permit persons to whom the Software is furnished to do so, subject to
9 ;; the following conditions:
11 ;; The above copyright notice and this permission notice shall be included
12 ;; in all copies or substantial portions of the Software.
14 ;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 ;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 ;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 ;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 ;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 (defvar *whitespace* (list #\Space #\Tab))
28 (defun add-completion (string)
29 "Add STRING as a custom-completion."
30 (setq cl-complete nil)
31 (with-cstring (c-str string)
32 (= 1 (libreadline::add-completion c-str))))
34 (defun clear-completions ()
35 "Clear all custom-completions."
36 (setq cl-complete nil)
37 (libreadline::clear-completions))
39 (defun use-cl-complete ()
40 "Load symbols in package CL-USER as custom-completions."
44 (do-symbols (sym (find-package :cl-user))
45 (add-completion (string-downcase (string sym)))))
49 ;;; Everything that affects the custom-completion collection goes
52 (defun use-custom-complete ()
53 "Use custom-competions."
54 (libreadline::use-custom-complete)
57 (defun use-filename-complete ()
58 "Use default completion system. (filename)"
59 (libreadline::use-filename-complete)
62 (defun add-history (string)
63 "Add STRING to history."
64 (with-cstring (c-string string)
65 (libreadline::add-history c-string))
68 (defun readline (&key (prompt "") (history t))
69 "Read a line from current TTY with line-editing."
70 (with-cstring (c-prompt prompt)
71 (let* ((char* (libreadline::readline c-prompt))
72 (str (string-trim *whitespace*
73 (convert-from-foreign-string char*))))
74 (free-foreign-object char*)
75 (when (and history (not (string= "" str)))