1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
# frozen_string_literal: false
#
# history.rb -
# $Release Version: 0.9.6$
# $Revision$
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
# --
#
#
#
module IRB # :nodoc:
class Context
NOPRINTING_IVARS.push "@eval_history_values"
# See #set_last_value
alias _set_last_value set_last_value
def set_last_value(value)
_set_last_value(value)
if defined?(@eval_history) && @eval_history
@eval_history_values.push @line_no, @last_value
@workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
end
@last_value
end
remove_method :eval_history= if method_defined?(:eval_history=)
# The command result history limit. This method is not available until
# #eval_history= was called with non-nil value (directly or via
# setting <code>IRB.conf[:EVAL_HISTORY]</code> in <code>.irbrc</code>).
attr_reader :eval_history
# Sets command result history limit. Default value is set from
# <code>IRB.conf[:EVAL_HISTORY]</code>.
#
# +no+ is an Integer or +nil+.
#
# Returns +no+ of history items if greater than 0.
#
# If +no+ is 0, the number of history items is unlimited.
#
# If +no+ is +nil+, execution result history isn't used (default).
#
# History values are available via <code>__</code> variable, see
# IRB::History.
def eval_history=(no)
if no
if defined?(@eval_history) && @eval_history
@eval_history_values.size(no)
else
@eval_history_values = History.new(no)
IRB.conf[:__TMP__EHV__] = @eval_history_values
@workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
IRB.conf.delete(:__TMP_EHV__)
end
else
@eval_history_values = nil
end
@eval_history = no
end
end
# Represents history of results of previously evaluated commands.
#
# Available via <code>__</code> variable, only if <code>IRB.conf[:EVAL_HISTORY]</code>
# or <code>IRB::CurrentContext().eval_history</code> is non-nil integer value
# (by default it is +nil+).
#
# Example (in `irb`):
#
# # Initialize history
# IRB::CurrentContext().eval_history = 10
# # => 10
#
# # Perform some commands...
# 1 + 2
# # => 3
# puts 'x'
# # x
# # => nil
# raise RuntimeError
# # ...error raised
#
# # Inspect history (format is "<item number> <evaluated value>":
# __
# # => 1 10
# # 2 3
# # 3 nil
#
# __[1]
# # => 10
#
class History
def initialize(size = 16) # :nodoc:
@size = size
@contents = []
end
def size(size) # :nodoc:
if size != 0 && size < @size
@contents = @contents[@size - size .. @size]
end
@size = size
end
# Get one item of the content (both positive and negative indexes work).
def [](idx)
begin
if idx >= 0
@contents.find{|no, val| no == idx}[1]
else
@contents[idx][1]
end
rescue NameError
nil
end
end
def push(no, val) # :nodoc:
@contents.push [no, val]
@contents.shift if @size != 0 && @contents.size > @size
end
alias real_inspect inspect
def inspect # :nodoc:
if @contents.empty?
return real_inspect
end
unless (last = @contents.pop)[1].equal?(self)
@contents.push last
last = nil
end
str = @contents.collect{|no, val|
if val.equal?(self)
"#{no} ...self-history..."
else
"#{no} #{val.inspect}"
end
}.join("\n")
if str == ""
str = "Empty."
end
@contents.push last if last
str
end
end
end
|