1 | #
|
---|
2 | # history.rb -
|
---|
3 | # $Release Version: 0.9.5$
|
---|
4 | # $Revision: 11708 $
|
---|
5 | # $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
|
---|
6 | # by Keiju ISHITSUKA([email protected])
|
---|
7 | #
|
---|
8 | # --
|
---|
9 | #
|
---|
10 | #
|
---|
11 | #
|
---|
12 |
|
---|
13 | module IRB
|
---|
14 |
|
---|
15 | class Context
|
---|
16 |
|
---|
17 | NOPRINTING_IVARS.push "@eval_history_values"
|
---|
18 |
|
---|
19 | alias _set_last_value set_last_value
|
---|
20 |
|
---|
21 | def set_last_value(value)
|
---|
22 | _set_last_value(value)
|
---|
23 |
|
---|
24 | # @workspace.evaluate self, "_ = IRB.CurrentContext.last_value"
|
---|
25 | if @eval_history #and !@eval_history_values.equal?(llv)
|
---|
26 | @eval_history_values.push @line_no, @last_value
|
---|
27 | @workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
|
---|
28 | end
|
---|
29 |
|
---|
30 | @last_value
|
---|
31 | end
|
---|
32 |
|
---|
33 | attr_reader :eval_history
|
---|
34 | def eval_history=(no)
|
---|
35 | if no
|
---|
36 | if defined?(@eval_history) && @eval_history
|
---|
37 | @eval_history_values.size(no)
|
---|
38 | else
|
---|
39 | @eval_history_values = History.new(no)
|
---|
40 | IRB.conf[:__TMP__EHV__] = @eval_history_values
|
---|
41 | @workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
|
---|
42 | IRB.conf.delete(:__TMP_EHV__)
|
---|
43 | end
|
---|
44 | else
|
---|
45 | @eval_history_values = nil
|
---|
46 | end
|
---|
47 | @eval_history = no
|
---|
48 | end
|
---|
49 | end
|
---|
50 |
|
---|
51 | class History
|
---|
52 | @RCS_ID='-$Id: history.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
|
---|
53 |
|
---|
54 | def initialize(size = 16)
|
---|
55 | @size = size
|
---|
56 | @contents = []
|
---|
57 | end
|
---|
58 |
|
---|
59 | def size(size)
|
---|
60 | if size != 0 && size < @size
|
---|
61 | @contents = @contents[@size - size .. @size]
|
---|
62 | end
|
---|
63 | @size = size
|
---|
64 | end
|
---|
65 |
|
---|
66 | def [](idx)
|
---|
67 | begin
|
---|
68 | if idx >= 0
|
---|
69 | @contents.find{|no, val| no == idx}[1]
|
---|
70 | else
|
---|
71 | @contents[idx][1]
|
---|
72 | end
|
---|
73 | rescue NameError
|
---|
74 | nil
|
---|
75 | end
|
---|
76 | end
|
---|
77 |
|
---|
78 | def push(no, val)
|
---|
79 | @contents.push [no, val]
|
---|
80 | @contents.shift if @size != 0 && @contents.size > @size
|
---|
81 | end
|
---|
82 |
|
---|
83 | alias real_inspect inspect
|
---|
84 |
|
---|
85 | def inspect
|
---|
86 | if @contents.empty?
|
---|
87 | return real_inspect
|
---|
88 | end
|
---|
89 |
|
---|
90 | unless (last = @contents.pop)[1].equal?(self)
|
---|
91 | @contents.push last
|
---|
92 | last = nil
|
---|
93 | end
|
---|
94 | str = @contents.collect{|no, val|
|
---|
95 | if val.equal?(self)
|
---|
96 | "#{no} ...self-history..."
|
---|
97 | else
|
---|
98 | "#{no} #{val.inspect}"
|
---|
99 | end
|
---|
100 | }.join("\n")
|
---|
101 | if str == ""
|
---|
102 | str = "Empty."
|
---|
103 | end
|
---|
104 | @contents.push last if last
|
---|
105 | str
|
---|
106 | end
|
---|
107 | end
|
---|
108 | end
|
---|
109 |
|
---|
110 |
|
---|