forth variable (case) macro : case: { (case) @ =if } ; : break { ;then } ; : switch { (case) ! } ; forth : emit putc() drop ; : type for dup c@ emit 1+ next drop ; here ] type '? emit 10 emit false repeat again ; is word? self : ." " state @ if $, c: type ;then type ; forth : cr 10 emit ; : esc 27 emit ; : clear esc ." [2J" esc ." [1;1H" ; : space 32 emit ; : onExit term_cleanup() clear ." Thanks for using TE!" cr 0 exit() ; : .help clear ." TE, A Hypertext Editor" cr ." ---------------------------------------------------" cr ." UP arrow or CTL+i moves up" cr ." DOWN arrow or CTL+k moves down" cr ." LEFT arrow or CTL+j moves left" cr ." RIGHT arrow or CTL+l moves right" cr ." ALT+i moves up one line" cr ." ALT+k moves down one line" cr ." CTL+@ moves left one word" cr ." CTL+_ moves right one word" cr ." HOME moves to the beginning of the line" cr ." END moves to the end of the line" cr ." DEL or CTL+d Delete the character under the cursor" cr ." CTL+s Save the current file" cr ." ALT+l Redraw the screen" cr ." BACKSPACE Erase the previous character" cr ." ALT+m Change the insert/overwrite mode" cr ." CTL+g Show this help screen" cr ." CTL+x Exit TE" cr ." CTL+z Evaluate the current file" cr cr ." Press ALT+l to return to your file" cr ; variable key 127 constant K_BS 140 constant K_UP 141 constant K_DOWN 142 constant K_RIGHT 143 constant K_LEFT 144 constant K_HOME 145 constant K_INS 146 constant K_DEL 147 constant K_END 148 constant K_PGUP 149 constant K_PGDN : ALTx 256 + ; : CTLx 31 and ; : Fx key @ 127 + ; : id false key ! ; : movement key @ switch K_LEFT case: left() id break K_RIGHT case: right() id break K_UP case: up() id break K_DOWN case: down() id break 'j CTLx case: left() id break 'l CTLx case: right() id break 'i CTLx case: up() id break 'k CTLx case: down() id break 'i ALTx case: lnup() id break 'k ALTx case: lndn() id break '@ CTLx case: wordleft() id break '_ CTLx case: wordright() id break K_HOME case: home() id break K_END case: end() id break K_PGUP case: pgup() id break K_PGDN case: pgdn() id break 'y ALTx case: top() id break 'v ALTx case: bottom() id break ; : editing key @ switch K_DEL case: del() id break 'd CTLx case: del() id break 's CTLx case: save() id break 'l ALTx case: 1 draw() id break K_BS case: back() id break 'm ALTx case: mode_change() id break 'a ALTx case: saveas() id break ; : buffer-size buffer dup strlen() ; : extras key @ switch 'g CTLx case: .help id break 'z CTLx case: buffer-size eval id break 'x CTLx case: quit() id break ; : insert? key @ if key @ insert() then ; : onKey key ! movement editing extras insert? reset ;