2685c4b374367145cb37c3ad5b923446d84e6604
[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-custom-complete ()
40     "Use custom-competions."
41     (libreadline::use-custom-complete)
42     nil)
43   
44   (defun use-filename-complete ()
45     "Use default completion system. (filename)"
46     (libreadline::use-filename-complete)
47     nil)
48
49   (defun use-cl-complete ()
50     "Load symbols in package CL-USER as custom-completions."
51     (unless cl-complete
52       (setq cl-complete t)
53       (clear-completions)
54       (do-symbols (sym (find-package :cl-user))
55         (add-completion (string-downcase (string sym)))))
56     (use-custom-complete)
57     nil)
58
59   (defun add-history (string)
60     "Add STRING to history."
61     (with-cstring (c-string string)
62       (libreadline::add-history c-string))
63     string)
64   
65   (defun readline (&key (prompt "") (history t))
66     "Read a line from current TTY with line-editing."
67     (with-cstring (c-prompt prompt)
68       (let ((str (string-trim
69                   *whitespace*
70                   (convert-from-cstring (libreadline::readline c-prompt)))))
71         (when (and history (not (string= "" str)))
72           (add-history str))))))