def handle_input c
case c
when Ncurses::KEY_ENTER
@value = get_cursed_value
@history.push @value unless @value =~ /^\s*$/
return false
when Ncurses::KEY_CANCEL
@value = nil
return false
when Ncurses::KEY_TAB
return true unless @completion_block
if @completions.empty?
v = get_cursed_value
c = @completion_block.call v
if c.size > 0
@value = c.map { |full, short| full }.shared_prefix(true)
set_cursed_value @value
position_cursor
end
if c.size > 1
@completions = c
@new_completions = true
@roll_completions = false
end
else
@new_completions = false
@roll_completions = true
end
return true
end
reset_completion_state
@value = nil
d =
case c
when Ncurses::KEY_LEFT
Ncurses::Form::REQ_PREV_CHAR
when Ncurses::KEY_RIGHT
Ncurses::Form::REQ_NEXT_CHAR
when Ncurses::KEY_DC
Ncurses::Form::REQ_DEL_CHAR
when Ncurses::KEY_BACKSPACE, 127
Ncurses::Form::REQ_DEL_PREV
when ?\C-a
nop
Ncurses::Form::REQ_BEG_FIELD
when ?\C-e
Ncurses::Form::REQ_END_FIELD
when ?\C-k
Ncurses::Form::REQ_CLR_EOF
when ?\C-u
set_cursed_value cursed_value_after_point
Ncurses::Form.form_driver @form, Ncurses::Form::REQ_END_FIELD
nop
Ncurses::Form::REQ_BEG_FIELD
when ?\C-w
Ncurses::Form.form_driver @form, Ncurses::Form::REQ_PREV_CHAR
Ncurses::Form.form_driver @form, Ncurses::Form::REQ_DEL_WORD
when Ncurses::KEY_UP, Ncurses::KEY_DOWN
unless @history.empty?
value = get_cursed_value
@i ||= @history.size
@history[@i] = value
@i = (@i + (c == Ncurses::KEY_UP ? -1 : 1)) % @history.size
@value = @history[@i]
set_cursed_value @value
Ncurses::Form::REQ_END_FIELD
end
else
c
end
Ncurses::Form.form_driver @form, d if d
true
end