diff --git a/basis/tools/completion/completion.factor b/basis/tools/completion/completion.factor index 3e32bf62e5..b4be885d8a 100644 --- a/basis/tools/completion/completion.factor +++ b/basis/tools/completion/completion.factor @@ -68,8 +68,11 @@ IN: tools.completion [ '[ >lower _ [ completion ] with map rank-completions ] ] bi if-empty ; +: name-completions ( str seq -- seq' ) + [ dup name>> ] { } map>assoc completions ; + : words-matching ( str -- seq ) - all-words [ dup name>> ] { } map>assoc completions ; + all-words name-completions ; : vocabs-matching ( str -- seq ) - vocabs [ dup name>> ] { } map>assoc completions ; \ No newline at end of file + dictionary get values name-completions ; \ No newline at end of file diff --git a/basis/ui/tools/listener/listener-tests.factor b/basis/ui/tools/listener/listener-tests.factor index f48d87b61d..5e7d8a395a 100644 --- a/basis/ui/tools/listener/listener-tests.factor +++ b/basis/ui/tools/listener/listener-tests.factor @@ -149,4 +149,10 @@ IN: ui.tools.listener.tests "l" get show-popup "l" get show-popup "l" get hide-popup -] unit-test \ No newline at end of file +] unit-test + +[ t ] [ { "USING:" "A" "B" "C" } complete-USING:? ] unit-test + +[ f ] [ { "USING:" "A" "B" "C" ";" } complete-USING:? ] unit-test + +[ t ] [ { "X" ";" "USING:" "A" "B" "C" } complete-USING:? ] unit-test \ No newline at end of file diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor index 9b08d0faae..1a1aa25eaa 100644 --- a/basis/ui/tools/listener/listener.factor +++ b/basis/ui/tools/listener/listener.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: inspector kernel help help.markup io io.styles models -strings namespaces parser quotations sequences vocabs words +strings splitting namespaces parser quotations sequences vocabs words continuations prettyprint listener debugger threads boxes concurrency.flags math arrays generic accessors combinators assocs fry generic.standard.engines.tuple combinators.short-circuit @@ -42,9 +42,28 @@ completion-popup ; assoc-stack ] if ; +: complete-IN:/USE:? ( tokens -- ? ) + 2 short tail* { "IN:" "USE:" } intersects? ; + +: chop-; ( seq -- seq' ) + { ";" } split1-last [ ] [ ] ?if ; + +: complete-USING:? ( tokens -- ? ) + chop-; { "USING:" } intersects? ; + +: up-to-caret ( caret document -- string ) + [ { 0 0 } ] 2dip doc-range ; + +: vocab-completion? ( interactor -- ? ) + [ editor-caret* ] [ model>> ] bi up-to-caret " \r\n" split + { [ complete-IN:/USE:? ] [ complete-USING:? ] } 1|| ; + : ( interactor -- model ) [ one-word-elt 1/3 seconds ] keep - '[ _ interactor-use assoc-stack ] ; + '[ + _ dup vocab-completion? + [ drop vocab ] [ interactor-use assoc-stack ] if + ] ; : ( output -- gadget ) interactor new-editor @@ -416,7 +435,7 @@ M: listener-gadget ungraft* ! Foo USING: summary ui.gadgets.labels ui.gadgets.tables colors ui.render -ui.gadgets.worlds ui.gadgets.glass tools.completion ui.gadgets splitting ; +ui.gadgets.worlds ui.gadgets.glass tools.completion ui.gadgets ; USE: tools.completion : ( model -- gadget ) @@ -468,29 +487,16 @@ completion-popup H{ { T{ key-down f f "ESC" } [ hide-completion-popup ] } } set-gestures -: ( interactor -- table ) - [ words-matching ] ; - -: ( interactor -- table ) - [ vocabs-matching ] ; - -: (show-completion-popup) ( interactor popup -- ) +: show-completion-popup ( interactor quot -- ) + dupd [ >>completion-popup ] keep [ find-world ] dip { 0 0 } show-glass ; -: complete-IN:/USE:? ( tokens -- ? ) - 2 short tail* { "IN:" "USE:" } intersects? ; - -: complete-USING:? ( tokens -- ? ) - { ";" } split1-last nip { "USING:" } intersects? ; - -: vocab-completion? ( interactor -- ? ) - [ editor-string ] [ editor-caret* ] bi head " " split - { [ complete-IN:/USE:? ] [ complete-USING:? ] } 1|| ; - : word-completion-popup ( interactor -- ) - dup (show-completion-popup) ; + dup vocab-completion? + [ vocabs-matching ] [ words-matching ] ? + show-completion-popup ; : pass-to-popup? ( gesture interactor -- ? ) [ [ key-down? ] [ key-up? ] bi or ]