{ f } [ { "USING:" "A" "B" "C" ";" } complete-vocab? ] unit-test
{ t } [ { "X" ";" "USING:" "A" "B" "C" } complete-vocab? ] unit-test
+{ f } [ { "CHAR:" } complete-CHAR:? ] unit-test
+{ t } [ { "CHAR:" "" } complete-CHAR:? ] unit-test
+{ t } [ { "CHAR:" "a" } complete-CHAR:? ] unit-test
: complete-vocab? ( tokens -- ? )
{ [ complete-single-vocab? ] [ complete-vocab-list? ] } 1|| ;
-: complete-CHAR:? ( tokens -- ? )
- 2 short tail* "CHAR:" swap member? ;
+<PRIVATE
+
+: complete-token? ( tokens token -- ? )
+ over last empty? [
+ [ harvest ?last ] [ = ] bi*
+ ] [
+ swap harvest dup length 1 >
+ [ 2 tail* ?first = ] [ 2drop f ] if
+ ] if ;
+
+PRIVATE>
+
+: complete-CHAR:? ( tokens -- ? ) "CHAR:" complete-token? ;
-: complete-COLOR:? ( tokens -- ? )
- 2 short tail* "COLOR:" swap member? ;
+: complete-COLOR:? ( tokens -- ? ) "COLOR:" complete-token? ;