]> gitweb.factorcode.org Git - factor.git/blob - extra/readline-listener/readline-listener.factor
Modify the listener vocabulary so that readline can hook in. Add the readline-listene...
[factor.git] / extra / readline-listener / readline-listener.factor
1 ! Copyright (C) 2011 Erik Charlebois.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.data fry io io.encodings.utf8 kernel
4 listener namespaces readline sequences threads vocabs
5 command-line ;
6 QUALIFIED: readline.ffi
7 IN: readline-listener
8
9 <PRIVATE
10 SYMBOL: completions
11
12 : prefixed-words ( prefix -- words )
13     '[ name>> _ head? ] all-words swap filter [ name>> ] map ;
14
15 : clear-completions ( -- )
16     f completions tset ;
17
18 : get-completions ( prefix -- completions )
19     completions tget dup [ nip ] [ drop
20         prefixed-words dup completions tset
21     ] if ;
22
23 TUPLE: readline-reader { prompt initial: f } ;
24 M: readline-reader stream-readln
25     flush [ prompt>> dup [ " " append ] [ ] if readline ]
26     keep f >>prompt drop ;
27
28 M: readline-reader prompt.
29     >>prompt drop ;
30 PRIVATE>
31
32 : readline-listener ( -- )
33     [
34       swap get-completions ?nth
35       [ clear-completions f ] unless*
36     ] set-completion
37     readline-reader new [ listener ] with-input-stream* ;
38
39 MAIN: readline-listener