#!/usr/local/bin/ruby
#
# ShellCommandLineEditor.rb
#
# $Author: hiroya $
# $Date: 2000/11/23 01:53:10 $
# Copyright (C) 2000 Hiroya KUBO
#
require "CommandLineEditor"
require "ShellExecutables"
require "ContextualExecutables"
require "UnixDirectoryClient"
require "StringUtil"
class RubyShell < CommandLineEditor
include ShellExecutables
PROMPT1 = ""
PROMPT2 = " > "
def initialize
super
getExecutables.update(getShellExecutables)
getExecutables.update(ContextualExecutables.new.getContextualExecutables)
@dir = UnixDirectoryClient.new
end
def prompt
@term.print(PROMPT1).set(['blue','underline','bold']).print(Dir.pwd).reset.print(PROMPT2)
end
def getMatchedFileNameList(path)
candidates = []
@dir.foreach(path.getDirectory) do |filename|
if( path.getFileName == nil ||
filename.index(path.getFileName) == 0 )
if( @dir.directory?(path.getDirectory+@dir.getSeparator+filename) )
candidates.push(filename+@dir.getSeparator)
else
candidates.push(filename)
end
end
end
return candidates.sort
end
def getCompletingPathList(key)
reg_name = @dir.getRegulatedName(@dir.getContextualName(key))
path = DirPath.new(reg_name,
@dir.dirname(reg_name),
@dir.basename(reg_name))
if(! @dir.directory?(path.getDirectory) ||
( ! @dir.directory?(reg_name) && key =~/\/$/ ))
return [nil]
end
list = getMatchedFileNameList(path)
if( @dir.directory?(path.getName) &&
(key == "" || key =~ /\/$/ ))
path = DirPath.new(path.getName, path.getName, "")
list = getMatchedFileNameList(path)
end
if(list.size == 1 &&
@dir.directory?(path.getName) &&
key != "" && key !~ /\/$/)
return [path, [path.getFileName+@dir.getSeparator()]]
else
return [path, list]
end
end
def getCompletingList(key)
path, list = getCompletingPathList(key)
if(path != nil && path.getFileName != nil)
list = StringUtil.removePrefix(path.getFileName, list)
end
return list
end
def showCompletingList(array)
key = @line.getCurrentWord
if(array!=nil)
array.each{|arg|
@term.print(key).print(arg).newline
}
end
end
end
class DirPath
def initialize(name=nil, dir=nil, filename=nil)
@name = name
@dir = dir
@filename = filename
end
def getName
return @name
end
def getFileName
return @filename
end
def getDirectory
return @dir
end
end
RubyShell.new.doit
syntax highlighted by Code2HTML, v. 0.9.1