-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* bin/irb lib/irb.rb lib/irb/...: IRB 0.9.5(new files)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8324 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
- Loading branch information
keiju
committed
Apr 13, 2005
1 parent
914c81e
commit 8e8cd64
Showing
3 changed files
with
313 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
#!/usr/local/bin/ruby | ||
# | ||
# save-history.rb - | ||
# $Release Version: 0.9.5$ | ||
# $Revision$ | ||
# $Date$ | ||
# by Keiju [email protected]) | ||
# | ||
# -- | ||
# | ||
# | ||
# | ||
|
||
@RCS_ID='-$Id$-' | ||
|
||
require "readline" | ||
|
||
module IRB | ||
class Context | ||
def init_save_history | ||
unless (class<<@io;self;end).include?(HistorySavingAbility) | ||
@io.extend(HistorySavingAbility) | ||
end | ||
end | ||
|
||
def save_history | ||
IRB.conf[:SAVE_HISTORY] | ||
end | ||
|
||
def save_history=(val) | ||
IRB.conf[:SAVE_HISTORY] = val | ||
if val | ||
main_context = IRB.conf[:MAIN_CONTEXT] | ||
main_context = self unless main_context | ||
main_context.init_save_history | ||
end | ||
end | ||
|
||
def history_file | ||
IRB.conf[:HISTORY_FILE] | ||
end | ||
|
||
def history_file=(hist) | ||
IRB.conf[:HISTORY_FILE] = hist | ||
end | ||
end | ||
|
||
module HistorySavingAbility | ||
include Readline | ||
|
||
def HistorySavingAbility.create_finalizer | ||
proc do | ||
if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0 | ||
if hf = IRB.conf[:HISTORY_FILE] | ||
file = File.expand_path(hf) | ||
end | ||
file = IRB.rc_file("_history") unless file | ||
open(file, 'w' ) do |f| | ||
hist = HISTORY.to_a | ||
f.puts(hist[-num..-1] || hist) | ||
end | ||
end | ||
end | ||
end | ||
|
||
def HistorySavingAbility.extended(obj) | ||
ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer) | ||
obj.load_history | ||
obj | ||
end | ||
|
||
def load_history | ||
hist = IRB.conf[:HISTORY_FILE] | ||
hist = IRB.rc_file("_history") unless hist | ||
if File.exist?(hist) | ||
open(hist) do |f| | ||
f.each {|l| HISTORY << l.chomp} | ||
end | ||
end | ||
end | ||
end | ||
end | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
# | ||
# notifier.rb - optput methods used by irb | ||
# $Release Version: 0.9.5$ | ||
# $Revision$ | ||
# $Date$ | ||
# by Keiju ISHITSUKA([email protected]) | ||
# | ||
# -- | ||
# | ||
# | ||
# | ||
|
||
require "e2mmap" | ||
require "irb/output-method" | ||
|
||
module IRB | ||
module Notifier | ||
extend Exception2MessageMapper | ||
def_exception :ErrUndefinedNotifier, | ||
"undefined notifier level: %d is specified" | ||
def_exception :ErrUnrecognizedLevel, | ||
"unrecognized notifier level: %s is specified" | ||
|
||
def def_notifier(prefix = "", output_method = StdioOutputMethod.new) | ||
CompositeNotifier.new(prefix, output_method) | ||
end | ||
module_function :def_notifier | ||
|
||
class AbstructNotifier | ||
def initialize(prefix, base_notifier) | ||
@prefix = prefix | ||
@base_notifier = base_notifier | ||
end | ||
|
||
attr_reader :prefix | ||
|
||
def notify? | ||
true | ||
end | ||
|
||
def print(*opts) | ||
@base_notifier.print prefix, *opts if notify? | ||
end | ||
|
||
def printn(*opts) | ||
@base_notifier.printn prefix, *opts if notify? | ||
end | ||
|
||
def printf(format, *opts) | ||
@base_notifier.printf(prefix + format, *opts) if notify? | ||
end | ||
|
||
def puts(*objs) | ||
if notify? | ||
@base_notifier.puts *objs.collect{|obj| prefix + obj.to_s} | ||
end | ||
end | ||
|
||
def pp(*objs) | ||
if notify? | ||
@base_notifier.ppx @prefix, *objs | ||
end | ||
end | ||
|
||
def ppx(prefix, *objs) | ||
if notify? | ||
@base_notifier.ppx @prefix+prefix, *objs | ||
end | ||
end | ||
|
||
def exec_if | ||
yield(@base_notifier) if notify? | ||
end | ||
end | ||
|
||
class CompositeNotifier<AbstructNotifier | ||
def initialize(prefix, base_notifier) | ||
super | ||
|
||
@notifiers = [D_NOMSG] | ||
@level_notifier = D_NOMSG | ||
end | ||
|
||
attr_reader :notifiers | ||
|
||
def def_notifier(level, prefix = "") | ||
notifier = LeveledNotifier.new(self, level, prefix) | ||
@notifiers[level] = notifier | ||
notifier | ||
end | ||
|
||
attr_reader :level_notifier | ||
alias level level_notifier | ||
|
||
def level_notifier=(value) | ||
case value | ||
when AbstructNotifier | ||
@level_notifier = value | ||
when Integer | ||
l = @notifiers[value] | ||
Notifier.Raise ErrUndefinedNotifer, value unless l | ||
@level_notifier = l | ||
else | ||
Notifier.Raise ErrUnrecognizedLevel, value unless l | ||
end | ||
end | ||
|
||
alias level= level_notifier= | ||
end | ||
|
||
class LeveledNotifier<AbstructNotifier | ||
include Comparable | ||
|
||
def initialize(base, level, prefix) | ||
super(prefix, base) | ||
|
||
@level = level | ||
end | ||
|
||
attr_reader :level | ||
|
||
def <=>(other) | ||
@level <=> other.level | ||
end | ||
|
||
def notify? | ||
@base_notifier.level >= self | ||
end | ||
end | ||
|
||
class NoMsgNotifier<LeveledNotifier | ||
def initialize | ||
@base_notifier = nil | ||
@level = 0 | ||
@prefix = "" | ||
end | ||
|
||
def notify? | ||
false | ||
end | ||
end | ||
|
||
D_NOMSG = NoMsgNotifier.new | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
# | ||
# output-method.rb - optput methods used by irb | ||
# $Release Version: 0.9.5$ | ||
# $Revision$ | ||
# $Date$ | ||
# by Keiju ISHITSUKA([email protected]) | ||
# | ||
# -- | ||
# | ||
# | ||
# | ||
|
||
require "e2mmap" | ||
|
||
module IRB | ||
# OutputMethod | ||
# StdioOutputMethod | ||
|
||
class OutputMethod | ||
@RCS_ID='-$Id$-' | ||
|
||
def print(*opts) | ||
IRB.fail NotImplementError, "print" | ||
end | ||
|
||
def printn(*opts) | ||
print opts.join(" "), "\n" | ||
end | ||
|
||
# extend printf | ||
def printf(format, *opts) | ||
if /(%*)%I/ =~ format | ||
format, opts = parse_printf_format(format, opts) | ||
end | ||
print sprintf(format, *opts) | ||
end | ||
|
||
# % | ||
# <フラグ> [#0- +] | ||
# <最小フィールド幅> (\*|\*[1-9][0-9]*\$|[1-9][0-9]*) | ||
# <精度>.(\*|\*[1-9][0-9]*\$|[1-9][0-9]*|)? | ||
# #<長さ修正文字>(hh|h|l|ll|L|q|j|z|t) | ||
# <変換修正文字>[diouxXeEfgGcsb%] | ||
def parse_printf_format(format, opts) | ||
return format, opts if $1.size % 2 == 1 | ||
end | ||
|
||
def foo(format) | ||
pos = 0 | ||
inspects = [] | ||
format.scan(/%[#0\-+ ]?(\*(?=[^0-9])|\*[1-9][0-9]*\$|[1-9][0-9]*(?=[^0-9]))?(\.(\*(?=[^0-9])|\*[1-9][0-9]*\$|[1-9][0-9]*(?=[^0-9])))?(([1-9][0-9]*\$)*)([diouxXeEfgGcsb%])/) {|f, p, pp, pos, new_pos, c| | ||
puts [f, p, pp, pos, new_pos, c].join("!") | ||
pos = new_pos if new_pos | ||
if c == "I" | ||
inspects.push pos.to_i | ||
(f||"")+(p||"")+(pp||"")+(pos||"")+"s" | ||
else | ||
$& | ||
end | ||
} | ||
end | ||
|
||
def puts(*objs) | ||
for obj in objs | ||
print(*obj) | ||
print "\n" | ||
end | ||
end | ||
|
||
def pp(*objs) | ||
puts *objs.collect{|obj| obj.inspect} | ||
end | ||
|
||
def ppx(prefix, *objs) | ||
puts *objs.collect{|obj| prefix+obj.inspect} | ||
end | ||
|
||
end | ||
|
||
class StdioOutputMethod<OutputMethod | ||
def print(*opts) | ||
STDOUT.print *opts | ||
end | ||
end | ||
end |