#
# RRreadline.rb
#
# $Author: hiroya $
# $Date: 2000/11/23 01:53:10 $
# Copyright (C) 2000 Hiroya KUBO
#
require "KeyBind"
require "Terminal"
require "EditingLine"
require "EditingContext"
require "CommandLineActions"
$term = nil
$suspendTerminal = nil
trap("SIGTSTP") do
$term.print("stop").echo(true)
$suspendTerminal = true
end
trap("SIGINT") do
$term.echo(true).newline
exit;
end
trap("SIGQUIT") do
$term.echo(true).newline
exit;
end
class RReadline
include CommandLineActions
def initialize
@keybind = KeyBindFactory.new.create
@term = TerminalFactory.new.create
@line = EditingLine.new
@ctx = EditingContext.new
$term = @term
@chr = nil
end
def getHistory
return @ctx.getEditingHistory
end
def setHistory(history)
@ctx.setEditingHistory(history)
end
def getEditingContext
return @ctx
end
def setEditingContext(ctx)
@ctx = ctx
end
def getEditingLine
return @line
end
def setEditingLine(line)
@line = line
end
# -- key bind --
def getKeyBind
return @keybind
end
def setKeyBind(keybind)
@keybind = keybind
end
# -- prompt --
def _print(list)
@term.print(list)
end
def prompt
_print("> ")
end
def showPrompt
prompt
@term.print(@line.getValue)
if(@line.size > 0 )
@term.rewind
prompt
if(@line.getCursorPosition > 0)
if(@term.end_of_line(@line.getCursorPosition) == 0)
@term.print(@line.toString).ln
else
@term.print(@line.toString)
end
end
end
end
# -- completion --
def getCompletingList(key)
return nil
end
def showCompletingList(array)
if(array!=nil)
array.each{|arg|
@term.print(arg).newline
}
end
end
# -- main --
def readline(addHistory = true)
@term.echo(false)
@line.clear
@ctx.clearCompositeKeyStroke
showPrompt
begin
while (chr = STDIN.getc)
# resume terminal after C-z
if($suspendTerminal == true)
@term.echo(false)
$suspendTerminal = false
end
begin
c = sprintf("%c", chr)
@ctx.setCurrentChar(c)
@ctx.addCompositeKeyStroke(c)
actionName = "default_command"
if((ka = @keybind[@ctx.getCompositeKeyStroke]) != nil)
actionName = ka.getAction
elsif((ka = @keybind[chr]) != nil)
actionName = ka.getAction
elsif( 32 <= chr && chr <= 126)
# " " to "~"
actionName = "self_insert_command"
end
eval actionName
@ctx.clearCompositeKeyStroke
rescue ContinueCompositeKeyStroke
end
end
rescue EndCommandLineEditor
line = @line.getValue
if(addHistory != nil && line != nil && line != "")
@ctx.storeCurrentEditingHistory(line)
end
ensure
@term.echo(true)
end
return @line.getValue
end
end
syntax highlighted by Code2HTML, v. 0.9.1