r4819: Auto commit for Debian build
[cl-readline.git] / readline.lisp
1 ;; Copyright (c) 2003 Nikodemus Siivola
2 ;; 
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:
10 ;; 
11 ;; The above copyright notice and this permission notice shall be included
12 ;; in all copies or substantial portions of the Software.
13 ;; 
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.
21  
22 (in-package readline)
23
24 (defvar *whitespace* (list #\Space #\Tab))
25
26 (let (cl-complete)
27   
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))))
33
34   (defun clear-completions ()
35     "Clear all custom-completions."
36     (setq cl-complete nil)
37     (libreadline::clear-completions))
38   
39   (defun use-cl-complete ()
40     "Load symbols in package CL-USER as custom-completions."
41     (unless cl-complete
42       (setq cl-complete t)
43       (clear-completions)
44       (do-symbols (sym (find-package :cl-user))
45         (add-completion (string-downcase (string sym)))))
46     (use-custom-complete)
47     nil))
48
49 ;;; Everything that affects the custom-completion collection goes
50 ;;; above.
51
52 (defun use-custom-complete ()
53   "Use custom-competions."
54   (libreadline::use-custom-complete)
55   nil)
56   
57 (defun use-filename-complete ()
58   "Use default completion system. (filename)"
59   (libreadline::use-filename-complete)
60   nil)
61
62 (defun add-history (string)
63   "Add STRING to history."
64   (with-cstring (c-string string)
65     (libreadline::add-history c-string))
66   string)
67   
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)))
76         (add-history str))
77       str)))