Add join lines command, C+j

db4
Slava Pestov 2009-01-25 22:56:35 -06:00
parent c6415c7b7d
commit b95a587ce1
2 changed files with 51 additions and 13 deletions

View File

@ -48,3 +48,11 @@ IN: ui.gadgets.editors.tests
"field" get [
[ "hello" ] [ "field" get field-model>> value>> ] unit-test
] with-grafted-gadget
[ "Hello world." ] [ "Hello \n world." join-lines ] unit-test
[ " Hello world. " ] [ " Hello \n world. " join-lines ] unit-test
[ " Hello world. Goodbye." ] [ " Hello \n world. \n Goodbye." join-lines ] unit-test
[ ] [ <editor> com-join-lines ] unit-test
[ ] [ <editor> "A" over set-editor-string com-join-lines ] unit-test
[ "A B" ] [ <editor> "A\nB" over set-editor-string [ com-join-lines ] [ editor-string ] bi ] unit-test

View File

@ -7,7 +7,7 @@ calendar alarms continuations ui.clipboards ui.commands
ui.gadgets ui.gadgets.borders ui.gadgets.buttons
ui.gadgets.labels ui.gadgets.scrollers ui.gadgets.theme
ui.gadgets.menus ui.gadgets.wrappers ui.render ui.text
ui.gestures math.geometry.rect ;
ui.gestures math.geometry.rect splitting unicode.categories ;
IN: ui.gadgets.editors
TUPLE: editor < gadget
@ -359,8 +359,6 @@ M: editor gadget-text* editor-string % ;
[ drop dup extend-selection dup mark>> click-loc ]
[ select-elt ] if ;
: insert-newline ( editor -- ) "\n" swap user-input* drop ;
: delete-next-character ( editor -- )
char-elt editor-delete ;
@ -420,10 +418,6 @@ editor "clipboard" f {
char-elt editor-next
] if ;
: previous-line ( editor -- ) line-elt editor-prev ;
: next-line ( editor -- ) line-elt editor-next ;
: previous-word ( editor -- ) word-elt editor-prev ;
: next-word ( editor -- ) word-elt editor-next ;
@ -465,12 +459,6 @@ editor "caret-motion" f {
: select-next-character ( editor -- )
char-elt editor-select-next ;
: select-previous-line ( editor -- )
line-elt editor-select-prev ;
: select-next-line ( editor -- )
line-elt editor-select-next ;
: select-previous-word ( editor -- )
word-elt editor-select-prev ;
@ -520,6 +508,47 @@ TUPLE: multiline-editor < editor ;
: <multiline-editor> ( -- editor )
multiline-editor new-editor ;
: previous-line ( editor -- ) line-elt editor-prev ;
: next-line ( editor -- ) line-elt editor-next ;
: select-previous-line ( editor -- )
line-elt editor-select-prev ;
: select-next-line ( editor -- )
line-elt editor-select-next ;
: insert-newline ( editor -- )
"\n" swap user-input* drop ;
: change-selection ( editor quot -- )
'[ gadget-selection @ ] keep user-input* drop ; inline
: join-lines ( string -- string' )
"\n" split
[ rest-slice [ [ blank? ] trim-left-slice ] change-each ]
[ but-last-slice [ [ blank? ] trim-right-slice ] change-each ]
[ " " join ]
tri ;
: this-line-and-next ( document line -- start end )
[ nip 0 swap 2array ]
[ [ nip 1+ ] [ 1+ swap doc-line length ] 2bi 2array ]
2bi ;
: last-line? ( document line -- ? )
[ last-line# ] dip = ;
: com-join-lines ( editor -- )
dup gadget-selection?
[ [ join-lines ] change-selection ] [
[ model>> ] [ editor-caret first ] bi
2dup last-line? [ 2drop ] [
[ this-line-and-next ] [ drop ] 2bi
[ join-lines ] change-doc-range
] if
] if ;
multiline-editor "multiline" f {
{ T{ key-down f f "UP" } previous-line }
{ T{ key-down f f "DOWN" } next-line }
@ -528,6 +557,7 @@ multiline-editor "multiline" f {
{ T{ key-down f f "RET" } insert-newline }
{ T{ key-down f { S+ } "RET" } insert-newline }
{ T{ key-down f f "ENTER" } insert-newline }
{ T{ key-down f { C+ } "j" } com-join-lines }
} define-command-map
TUPLE: source-editor < multiline-editor ;