2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2002-07-09 07:17:17 -04:00
|
|
|
#
|
2009-03-05 22:56:38 -05:00
|
|
|
# history.rb -
|
2009-07-07 07:36:20 -04:00
|
|
|
# $Release Version: 0.9.6$
|
2002-07-09 07:17:17 -04:00
|
|
|
# $Revision$
|
2005-04-13 11:27:09 -04:00
|
|
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
2002-07-09 07:17:17 -04:00
|
|
|
#
|
|
|
|
# --
|
|
|
|
#
|
2009-03-05 22:56:38 -05:00
|
|
|
#
|
2002-07-09 07:17:17 -04:00
|
|
|
#
|
|
|
|
|
2012-12-13 00:22:30 -05:00
|
|
|
module IRB # :nodoc:
|
2002-07-09 07:17:17 -04:00
|
|
|
|
|
|
|
class Context
|
|
|
|
|
|
|
|
NOPRINTING_IVARS.push "@eval_history_values"
|
|
|
|
|
2012-12-21 00:45:50 -05:00
|
|
|
# See #set_last_value
|
2002-07-09 07:17:17 -04:00
|
|
|
alias _set_last_value set_last_value
|
|
|
|
|
|
|
|
def set_last_value(value)
|
|
|
|
_set_last_value(value)
|
|
|
|
|
2014-08-08 22:02:58 -04:00
|
|
|
if @eval_history
|
2014-08-08 21:36:49 -04:00
|
|
|
@eval_history_values.push @line_no, @last_value
|
|
|
|
@workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
@last_value
|
|
|
|
end
|
|
|
|
|
2012-12-13 00:22:30 -05:00
|
|
|
# The command result history limit.
|
2002-07-09 07:17:17 -04:00
|
|
|
attr_reader :eval_history
|
2012-12-13 00:22:30 -05:00
|
|
|
# Sets command result history limit.
|
|
|
|
#
|
|
|
|
# +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).
|
2002-07-09 07:17:17 -04:00
|
|
|
def eval_history=(no)
|
|
|
|
if no
|
2014-08-08 21:36:49 -04:00
|
|
|
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
|
2002-07-09 07:17:17 -04:00
|
|
|
else
|
2014-08-08 21:36:49 -04:00
|
|
|
@eval_history_values = nil
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
@eval_history = no
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-21 00:45:50 -05:00
|
|
|
class History # :nodoc:
|
2002-07-09 07:17:17 -04:00
|
|
|
|
|
|
|
def initialize(size = 16)
|
|
|
|
@size = size
|
|
|
|
@contents = []
|
|
|
|
end
|
|
|
|
|
|
|
|
def size(size)
|
2009-03-05 22:56:38 -05:00
|
|
|
if size != 0 && size < @size
|
2014-08-08 21:36:49 -04:00
|
|
|
@contents = @contents[@size - size .. @size]
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
@size = size
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](idx)
|
|
|
|
begin
|
2014-08-08 21:36:49 -04:00
|
|
|
if idx >= 0
|
|
|
|
@contents.find{|no, val| no == idx}[1]
|
|
|
|
else
|
|
|
|
@contents[idx][1]
|
|
|
|
end
|
2002-07-09 07:17:17 -04:00
|
|
|
rescue NameError
|
2014-08-08 21:36:49 -04:00
|
|
|
nil
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def push(no, val)
|
|
|
|
@contents.push [no, val]
|
|
|
|
@contents.shift if @size != 0 && @contents.size > @size
|
|
|
|
end
|
2009-03-05 22:56:38 -05:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
alias real_inspect inspect
|
|
|
|
|
|
|
|
def inspect
|
|
|
|
if @contents.empty?
|
2014-08-08 21:36:49 -04:00
|
|
|
return real_inspect
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
unless (last = @contents.pop)[1].equal?(self)
|
2014-08-08 21:36:49 -04:00
|
|
|
@contents.push last
|
|
|
|
last = nil
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
str = @contents.collect{|no, val|
|
2014-08-08 21:36:49 -04:00
|
|
|
if val.equal?(self)
|
|
|
|
"#{no} ...self-history..."
|
|
|
|
else
|
|
|
|
"#{no} #{val.inspect}"
|
|
|
|
end
|
2002-07-09 07:17:17 -04:00
|
|
|
}.join("\n")
|
|
|
|
if str == ""
|
2014-08-08 21:36:49 -04:00
|
|
|
str = "Empty."
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
@contents.push last if last
|
|
|
|
str
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|