irb 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/README.md +3 -3
- data/doc/irb/irb-tools.rd.ja +184 -0
- data/doc/irb/irb.rd.ja +411 -0
- data/irb.gemspec +58 -1
- data/lib/irb.rb +106 -35
- data/lib/irb/cmd/fork.rb +1 -1
- data/lib/irb/cmd/help.rb +9 -5
- data/lib/irb/color.rb +233 -0
- data/lib/irb/completion.rb +126 -33
- data/lib/irb/context.rb +105 -65
- data/lib/irb/ext/history.rb +47 -9
- data/lib/irb/ext/multi-irb.rb +7 -7
- data/lib/irb/ext/save-history.rb +17 -5
- data/lib/irb/ext/tracer.rb +14 -1
- data/lib/irb/ext/use-loader.rb +3 -0
- data/lib/irb/extend-command.rb +70 -48
- data/lib/irb/frame.rb +12 -7
- data/lib/irb/init.rb +30 -20
- data/lib/irb/input-method.rb +108 -3
- data/lib/irb/inspector.rb +12 -2
- data/lib/irb/lc/error.rb +55 -16
- data/lib/irb/lc/help-message +9 -6
- data/lib/irb/lc/ja/error.rb +55 -14
- data/lib/irb/lc/ja/help-message +9 -6
- data/lib/irb/locale.rb +5 -1
- data/lib/irb/notifier.rb +12 -8
- data/lib/irb/output-method.rb +6 -6
- data/lib/irb/ruby-lex.rb +345 -1039
- data/lib/irb/ruby_logo.aa +38 -0
- data/lib/irb/version.rb +2 -2
- data/lib/irb/workspace.rb +58 -20
- data/man/irb.1 +207 -0
- metadata +21 -6
- data/.gitignore +0 -9
- data/.travis.yml +0 -6
- data/lib/irb/ruby-token.rb +0 -267
- data/lib/irb/slex.rb +0 -282
    
        data/lib/irb/completion.rb
    CHANGED
    
    | @@ -8,6 +8,7 @@ | |
| 8 8 | 
             
            #
         | 
| 9 9 |  | 
| 10 10 | 
             
            require "readline"
         | 
| 11 | 
            +
            autoload :RDoc, "rdoc"
         | 
| 11 12 |  | 
| 12 13 | 
             
            module IRB
         | 
| 13 14 | 
             
              module InputCompletor # :nodoc:
         | 
| @@ -35,9 +36,13 @@ module IRB | |
| 35 36 | 
             
                  yield
         | 
| 36 37 | 
             
                ]
         | 
| 37 38 |  | 
| 39 | 
            +
                BASIC_WORD_BREAK_CHARACTERS = " \t\n`><=;|&{("
         | 
| 40 | 
            +
             | 
| 38 41 | 
             
                CompletionProc = proc { |input|
         | 
| 39 | 
            -
                   | 
| 42 | 
            +
                  retrieve_completion_data(input).compact.map{ |i| i.encode(Encoding.default_external) }
         | 
| 43 | 
            +
                }
         | 
| 40 44 |  | 
| 45 | 
            +
                def self.retrieve_completion_data(input, bind: IRB.conf[:MAIN_CONTEXT].workspace.binding, doc_namespace: false)
         | 
| 41 46 | 
             
                  case input
         | 
| 42 47 | 
             
                  when /^((["'`]).*\2)\.([^.]*)$/
         | 
| 43 48 | 
             
                    # String
         | 
| @@ -45,7 +50,11 @@ module IRB | |
| 45 50 | 
             
                    message = Regexp.quote($3)
         | 
| 46 51 |  | 
| 47 52 | 
             
                    candidates = String.instance_methods.collect{|m| m.to_s}
         | 
| 48 | 
            -
                     | 
| 53 | 
            +
                    if doc_namespace
         | 
| 54 | 
            +
                      "String.#{message}"
         | 
| 55 | 
            +
                    else
         | 
| 56 | 
            +
                      select_message(receiver, message, candidates)
         | 
| 57 | 
            +
                    end
         | 
| 49 58 |  | 
| 50 59 | 
             
                  when /^(\/[^\/]*\/)\.([^.]*)$/
         | 
| 51 60 | 
             
                    # Regexp
         | 
| @@ -53,7 +62,11 @@ module IRB | |
| 53 62 | 
             
                    message = Regexp.quote($2)
         | 
| 54 63 |  | 
| 55 64 | 
             
                    candidates = Regexp.instance_methods.collect{|m| m.to_s}
         | 
| 56 | 
            -
                     | 
| 65 | 
            +
                    if doc_namespace
         | 
| 66 | 
            +
                      "Regexp.#{message}"
         | 
| 67 | 
            +
                    else
         | 
| 68 | 
            +
                      select_message(receiver, message, candidates)
         | 
| 69 | 
            +
                    end
         | 
| 57 70 |  | 
| 58 71 | 
             
                  when /^([^\]]*\])\.([^.]*)$/
         | 
| 59 72 | 
             
                    # Array
         | 
| @@ -61,19 +74,28 @@ module IRB | |
| 61 74 | 
             
                    message = Regexp.quote($2)
         | 
| 62 75 |  | 
| 63 76 | 
             
                    candidates = Array.instance_methods.collect{|m| m.to_s}
         | 
| 64 | 
            -
                     | 
| 77 | 
            +
                    if doc_namespace
         | 
| 78 | 
            +
                      "Array.#{message}"
         | 
| 79 | 
            +
                    else
         | 
| 80 | 
            +
                      select_message(receiver, message, candidates)
         | 
| 81 | 
            +
                    end
         | 
| 65 82 |  | 
| 66 83 | 
             
                  when /^([^\}]*\})\.([^.]*)$/
         | 
| 67 84 | 
             
                    # Proc or Hash
         | 
| 68 85 | 
             
                    receiver = $1
         | 
| 69 86 | 
             
                    message = Regexp.quote($2)
         | 
| 70 87 |  | 
| 71 | 
            -
                     | 
| 72 | 
            -
                     | 
| 73 | 
            -
                     | 
| 88 | 
            +
                    proc_candidates = Proc.instance_methods.collect{|m| m.to_s}
         | 
| 89 | 
            +
                    hash_candidates = Hash.instance_methods.collect{|m| m.to_s}
         | 
| 90 | 
            +
                    if doc_namespace
         | 
| 91 | 
            +
                      ["Proc.#{message}", "Hash.#{message}"]
         | 
| 92 | 
            +
                    else
         | 
| 93 | 
            +
                      select_message(receiver, message, proc_candidates | hash_candidates)
         | 
| 94 | 
            +
                    end
         | 
| 74 95 |  | 
| 75 96 | 
             
                  when /^(:[^:.]*)$/
         | 
| 76 97 | 
             
                    # Symbol
         | 
| 98 | 
            +
                    return nil if doc_namespace
         | 
| 77 99 | 
             
                    if Symbol.respond_to?(:all_symbols)
         | 
| 78 100 | 
             
                      sym = $1
         | 
| 79 101 | 
             
                      candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
         | 
| @@ -86,7 +108,11 @@ module IRB | |
| 86 108 | 
             
                    # Absolute Constant or class methods
         | 
| 87 109 | 
             
                    receiver = $1
         | 
| 88 110 | 
             
                    candidates = Object.constants.collect{|m| m.to_s}
         | 
| 89 | 
            -
                     | 
| 111 | 
            +
                    if doc_namespace
         | 
| 112 | 
            +
                      candidates.find { |i| i == receiver }
         | 
| 113 | 
            +
                    else
         | 
| 114 | 
            +
                      candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
         | 
| 115 | 
            +
                    end
         | 
| 90 116 |  | 
| 91 117 | 
             
                  when /^([A-Z].*)::([^:.]*)$/
         | 
| 92 118 | 
             
                    # Constant or class methods
         | 
| @@ -98,7 +124,11 @@ module IRB | |
| 98 124 | 
             
                    rescue Exception
         | 
| 99 125 | 
             
                      candidates = []
         | 
| 100 126 | 
             
                    end
         | 
| 101 | 
            -
                     | 
| 127 | 
            +
                    if doc_namespace
         | 
| 128 | 
            +
                      "#{receiver}::#{message}"
         | 
| 129 | 
            +
                    else
         | 
| 130 | 
            +
                      select_message(receiver, message, candidates, "::")
         | 
| 131 | 
            +
                    end
         | 
| 102 132 |  | 
| 103 133 | 
             
                  when /^(:[^:.]+)(\.|::)([^.]*)$/
         | 
| 104 134 | 
             
                    # Symbol
         | 
| @@ -107,20 +137,33 @@ module IRB | |
| 107 137 | 
             
                    message = Regexp.quote($3)
         | 
| 108 138 |  | 
| 109 139 | 
             
                    candidates = Symbol.instance_methods.collect{|m| m.to_s}
         | 
| 110 | 
            -
                     | 
| 140 | 
            +
                    if doc_namespace
         | 
| 141 | 
            +
                      "Symbol.#{message}"
         | 
| 142 | 
            +
                    else
         | 
| 143 | 
            +
                      select_message(receiver, message, candidates, sep)
         | 
| 144 | 
            +
                    end
         | 
| 111 145 |  | 
| 112 | 
            -
                  when /^( | 
| 146 | 
            +
                  when /^(?<num>-?(0[dbo])?[0-9_]+(\.[0-9_]+)?(([eE][+-]?[0-9]+)?i?|r)?)(?<sep>\.|::)(?<mes>[^.]*)$/
         | 
| 113 147 | 
             
                    # Numeric
         | 
| 114 | 
            -
                    receiver =  | 
| 115 | 
            -
                    sep =  | 
| 116 | 
            -
                    message = Regexp.quote( | 
| 148 | 
            +
                    receiver = $~[:num]
         | 
| 149 | 
            +
                    sep = $~[:sep]
         | 
| 150 | 
            +
                    message = Regexp.quote($~[:mes])
         | 
| 117 151 |  | 
| 118 152 | 
             
                    begin
         | 
| 119 | 
            -
                       | 
| 153 | 
            +
                      instance = eval(receiver, bind)
         | 
| 154 | 
            +
                      if doc_namespace
         | 
| 155 | 
            +
                        "#{instance.class.name}.#{message}"
         | 
| 156 | 
            +
                      else
         | 
| 157 | 
            +
                        candidates = instance.methods.collect{|m| m.to_s}
         | 
| 158 | 
            +
                        select_message(receiver, message, candidates, sep)
         | 
| 159 | 
            +
                      end
         | 
| 120 160 | 
             
                    rescue Exception
         | 
| 121 | 
            -
                       | 
| 161 | 
            +
                      if doc_namespace
         | 
| 162 | 
            +
                        nil
         | 
| 163 | 
            +
                      else
         | 
| 164 | 
            +
                        candidates = []
         | 
| 165 | 
            +
                      end
         | 
| 122 166 | 
             
                    end
         | 
| 123 | 
            -
                    select_message(receiver, message, candidates, sep)
         | 
| 124 167 |  | 
| 125 168 | 
             
                  when /^(-?0x[0-9a-fA-F_]+)(\.|::)([^.]*)$/
         | 
| 126 169 | 
             
                    # Numeric(0xFFFF)
         | 
| @@ -129,16 +172,30 @@ module IRB | |
| 129 172 | 
             
                    message = Regexp.quote($3)
         | 
| 130 173 |  | 
| 131 174 | 
             
                    begin
         | 
| 132 | 
            -
                       | 
| 175 | 
            +
                      instance = eval(receiver, bind)
         | 
| 176 | 
            +
                      if doc_namespace
         | 
| 177 | 
            +
                        "#{instance.class.name}.#{message}"
         | 
| 178 | 
            +
                      else
         | 
| 179 | 
            +
                        candidates = instance.methods.collect{|m| m.to_s}
         | 
| 180 | 
            +
                        select_message(receiver, message, candidates, sep)
         | 
| 181 | 
            +
                      end
         | 
| 133 182 | 
             
                    rescue Exception
         | 
| 134 | 
            -
                       | 
| 183 | 
            +
                      if doc_namespace
         | 
| 184 | 
            +
                        nil
         | 
| 185 | 
            +
                      else
         | 
| 186 | 
            +
                        candidates = []
         | 
| 187 | 
            +
                      end
         | 
| 135 188 | 
             
                    end
         | 
| 136 | 
            -
                    select_message(receiver, message, candidates, sep)
         | 
| 137 189 |  | 
| 138 190 | 
             
                  when /^(\$[^.]*)$/
         | 
| 139 191 | 
             
                    # global var
         | 
| 140 | 
            -
                     | 
| 141 | 
            -
                     | 
| 192 | 
            +
                    gvar = $1
         | 
| 193 | 
            +
                    all_gvars = global_variables.collect{|m| m.to_s}
         | 
| 194 | 
            +
                    if doc_namespace
         | 
| 195 | 
            +
                      all_gvars.find{ |i| i == gvar }
         | 
| 196 | 
            +
                    else
         | 
| 197 | 
            +
                      all_gvars.grep(Regexp.new(Regexp.quote(gvar)))
         | 
| 198 | 
            +
                    end
         | 
| 142 199 |  | 
| 143 200 | 
             
                  when /^([^."].*)(\.|::)([^.]*)$/
         | 
| 144 201 | 
             
                    # variable.func or func.func
         | 
| @@ -146,7 +203,7 @@ module IRB | |
| 146 203 | 
             
                    sep = $2
         | 
| 147 204 | 
             
                    message = Regexp.quote($3)
         | 
| 148 205 |  | 
| 149 | 
            -
                    gv = eval("global_variables", bind).collect{|m| m.to_s}
         | 
| 206 | 
            +
                    gv = eval("global_variables", bind).collect{|m| m.to_s}.append("true", "false", "nil")
         | 
| 150 207 | 
             
                    lv = eval("local_variables", bind).collect{|m| m.to_s}
         | 
| 151 208 | 
             
                    iv = eval("instance_variables", bind).collect{|m| m.to_s}
         | 
| 152 209 | 
             
                    cv = eval("self.class.constants", bind).collect{|m| m.to_s}
         | 
| @@ -177,7 +234,11 @@ module IRB | |
| 177 234 | 
             
                      candidates.sort!
         | 
| 178 235 | 
             
                      candidates.uniq!
         | 
| 179 236 | 
             
                    end
         | 
| 180 | 
            -
                     | 
| 237 | 
            +
                    if doc_namespace
         | 
| 238 | 
            +
                      "#{rec.class.name}#{sep}#{candidates.find{ |i| i == message }}"
         | 
| 239 | 
            +
                    else
         | 
| 240 | 
            +
                      select_message(receiver, message, candidates, sep)
         | 
| 241 | 
            +
                    end
         | 
| 181 242 |  | 
| 182 243 | 
             
                  when /^\.([^.]*)$/
         | 
| 183 244 | 
             
                    # unknown(maybe String)
         | 
| @@ -186,12 +247,50 @@ module IRB | |
| 186 247 | 
             
                    message = Regexp.quote($1)
         | 
| 187 248 |  | 
| 188 249 | 
             
                    candidates = String.instance_methods(true).collect{|m| m.to_s}
         | 
| 189 | 
            -
                     | 
| 250 | 
            +
                    if doc_namespace
         | 
| 251 | 
            +
                      "String.#{candidates.find{ |i| i == message }}"
         | 
| 252 | 
            +
                    else
         | 
| 253 | 
            +
                      select_message(receiver, message, candidates)
         | 
| 254 | 
            +
                    end
         | 
| 190 255 |  | 
| 191 256 | 
             
                  else
         | 
| 192 257 | 
             
                    candidates = eval("methods | private_methods | local_variables | instance_variables | self.class.constants", bind).collect{|m| m.to_s}
         | 
| 258 | 
            +
                    conditions |= ReservedWords
         | 
| 193 259 |  | 
| 194 | 
            -
                     | 
| 260 | 
            +
                    if doc_namespace
         | 
| 261 | 
            +
                      candidates.find{ |i| i == input }
         | 
| 262 | 
            +
                    else
         | 
| 263 | 
            +
                      candidates.grep(/^#{Regexp.quote(input)}/)
         | 
| 264 | 
            +
                    end
         | 
| 265 | 
            +
                  end
         | 
| 266 | 
            +
                end
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                PerfectMatchedProc = ->(matched) {
         | 
| 269 | 
            +
                  RDocRIDriver ||= RDoc::RI::Driver.new
         | 
| 270 | 
            +
                  if matched =~ /\A(?:::)?RubyVM/ and not ENV['RUBY_YES_I_AM_NOT_A_NORMAL_USER']
         | 
| 271 | 
            +
                    File.open(File.join(__dir__, 'ruby_logo.aa')) do |f|
         | 
| 272 | 
            +
                      RDocRIDriver.page do |io|
         | 
| 273 | 
            +
                        IO.copy_stream(f, io)
         | 
| 274 | 
            +
                      end
         | 
| 275 | 
            +
                    end
         | 
| 276 | 
            +
                    return
         | 
| 277 | 
            +
                  end
         | 
| 278 | 
            +
                  namespace = retrieve_completion_data(matched, doc_namespace: true)
         | 
| 279 | 
            +
                  return unless matched
         | 
| 280 | 
            +
                  if namespace.is_a?(Array)
         | 
| 281 | 
            +
                    out = RDoc::Markup::Document.new
         | 
| 282 | 
            +
                    namespace.each do |m|
         | 
| 283 | 
            +
                      begin
         | 
| 284 | 
            +
                        RDocRIDriver.add_method(out, m)
         | 
| 285 | 
            +
                      rescue RDoc::RI::Driver::NotFoundError
         | 
| 286 | 
            +
                      end
         | 
| 287 | 
            +
                    end
         | 
| 288 | 
            +
                    RDocRIDriver.display(out)
         | 
| 289 | 
            +
                  else
         | 
| 290 | 
            +
                    begin
         | 
| 291 | 
            +
                      RDocRIDriver.display_names([namespace])
         | 
| 292 | 
            +
                    rescue RDoc::RI::Driver::NotFoundError
         | 
| 293 | 
            +
                    end
         | 
| 195 294 | 
             
                  end
         | 
| 196 295 | 
             
                }
         | 
| 197 296 |  | 
| @@ -225,7 +324,7 @@ module IRB | |
| 225 324 | 
             
                    end
         | 
| 226 325 | 
             
                  end
         | 
| 227 326 |  | 
| 228 | 
            -
                  %i(IRB  | 
| 327 | 
            +
                  %i(IRB RubyLex).each do |sym|
         | 
| 229 328 | 
             
                    next unless Object.const_defined?(sym)
         | 
| 230 329 | 
             
                    scanner.call(Object.const_get(sym))
         | 
| 231 330 | 
             
                  end
         | 
| @@ -236,9 +335,3 @@ module IRB | |
| 236 335 | 
             
                end
         | 
| 237 336 | 
             
              end
         | 
| 238 337 | 
             
            end
         | 
| 239 | 
            -
             | 
| 240 | 
            -
            if Readline.respond_to?("basic_word_break_characters=")
         | 
| 241 | 
            -
              Readline.basic_word_break_characters= " \t\n`><=;|&{("
         | 
| 242 | 
            -
            end
         | 
| 243 | 
            -
            Readline.completion_append_character = nil
         | 
| 244 | 
            -
            Readline.completion_proc = IRB::InputCompletor::CompletionProc
         | 
    
        data/lib/irb/context.rb
    CHANGED
    
    | @@ -22,10 +22,10 @@ module IRB | |
| 22 22 | 
             
                #
         | 
| 23 23 | 
             
                # The optional +input_method+ argument:
         | 
| 24 24 | 
             
                #
         | 
| 25 | 
            -
                # +nil+::     uses stdin or Readline
         | 
| 25 | 
            +
                # +nil+::     uses stdin or Reidline or Readline
         | 
| 26 26 | 
             
                # +String+::  uses a File
         | 
| 27 27 | 
             
                # +other+::   uses this as InputMethod
         | 
| 28 | 
            -
                def initialize(irb, workspace = nil, input_method = nil | 
| 28 | 
            +
                def initialize(irb, workspace = nil, input_method = nil)
         | 
| 29 29 | 
             
                  @irb = irb
         | 
| 30 30 | 
             
                  if workspace
         | 
| 31 31 | 
             
                    @workspace = workspace
         | 
| @@ -39,7 +39,21 @@ module IRB | |
| 39 39 | 
             
                  @rc = IRB.conf[:RC]
         | 
| 40 40 | 
             
                  @load_modules = IRB.conf[:LOAD_MODULES]
         | 
| 41 41 |  | 
| 42 | 
            -
                   | 
| 42 | 
            +
                  if IRB.conf.has_key?(:USE_SINGLELINE)
         | 
| 43 | 
            +
                    @use_singleline = IRB.conf[:USE_SINGLELINE]
         | 
| 44 | 
            +
                  elsif IRB.conf.has_key?(:USE_READLINE) # backward compatibility
         | 
| 45 | 
            +
                    @use_singleline = IRB.conf[:USE_READLINE]
         | 
| 46 | 
            +
                  else
         | 
| 47 | 
            +
                    @use_singleline = nil
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                  if IRB.conf.has_key?(:USE_MULTILINE)
         | 
| 50 | 
            +
                    @use_multiline = IRB.conf[:USE_MULTILINE]
         | 
| 51 | 
            +
                  elsif IRB.conf.has_key?(:USE_REIDLINE) # backward compatibility
         | 
| 52 | 
            +
                    @use_multiline = IRB.conf[:USE_REIDLINE]
         | 
| 53 | 
            +
                  else
         | 
| 54 | 
            +
                    @use_multiline = nil
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                  @use_colorize = IRB.conf[:USE_COLORIZE]
         | 
| 43 57 | 
             
                  @verbose = IRB.conf[:VERBOSE]
         | 
| 44 58 | 
             
                  @io = nil
         | 
| 45 59 |  | 
| @@ -64,23 +78,48 @@ module IRB | |
| 64 78 |  | 
| 65 79 | 
             
                  case input_method
         | 
| 66 80 | 
             
                  when nil
         | 
| 67 | 
            -
                     | 
| 81 | 
            +
                    @io = nil
         | 
| 82 | 
            +
                    case use_multiline?
         | 
| 68 83 | 
             
                    when nil
         | 
| 69 | 
            -
                      if  | 
| 70 | 
            -
             | 
| 71 | 
            -
                         | 
| 84 | 
            +
                      if STDIN.tty? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
         | 
| 85 | 
            +
                        # Both of multiline mode and singleline mode aren't specified.
         | 
| 86 | 
            +
                        puts <<~EOM
         | 
| 87 | 
            +
                          This version of IRB is drastically different from the previous version.
         | 
| 88 | 
            +
                          If you hit any issues, you can use "irb --legacy" to run the old version.
         | 
| 89 | 
            +
                          If you want to just erase this message, please use "irb --multiline" or
         | 
| 90 | 
            +
                          add `IRB.conf[:USE_MULTILINE] = true` to your ~/.irbrc file.
         | 
| 91 | 
            +
                        EOM
         | 
| 92 | 
            +
                        @io = ReidlineInputMethod.new
         | 
| 72 93 | 
             
                      else
         | 
| 73 | 
            -
                        @io =  | 
| 94 | 
            +
                        @io = nil
         | 
| 74 95 | 
             
                      end
         | 
| 75 96 | 
             
                    when false
         | 
| 76 | 
            -
                      @io =  | 
| 97 | 
            +
                      @io = nil
         | 
| 77 98 | 
             
                    when true
         | 
| 78 | 
            -
                       | 
| 79 | 
            -
             | 
| 99 | 
            +
                      @io = ReidlineInputMethod.new
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
                    unless @io
         | 
| 102 | 
            +
                      case use_singleline?
         | 
| 103 | 
            +
                      when nil
         | 
| 104 | 
            +
                        if (defined?(ReadlineInputMethod) && STDIN.tty? &&
         | 
| 105 | 
            +
                            IRB.conf[:PROMPT_MODE] != :INF_RUBY)
         | 
| 106 | 
            +
                          @io = ReadlineInputMethod.new
         | 
| 107 | 
            +
                        else
         | 
| 108 | 
            +
                          @io = nil
         | 
| 109 | 
            +
                        end
         | 
| 110 | 
            +
                      when false
         | 
| 111 | 
            +
                        @io = nil
         | 
| 112 | 
            +
                      when true
         | 
| 113 | 
            +
                        if defined?(ReadlineInputMethod)
         | 
| 114 | 
            +
                          @io = ReadlineInputMethod.new
         | 
| 115 | 
            +
                        else
         | 
| 116 | 
            +
                          @io = nil
         | 
| 117 | 
            +
                        end
         | 
| 80 118 | 
             
                      else
         | 
| 81 | 
            -
                        @io =  | 
| 119 | 
            +
                        @io = nil
         | 
| 82 120 | 
             
                      end
         | 
| 83 121 | 
             
                    end
         | 
| 122 | 
            +
                    @io = StdioInputMethod.new unless @io
         | 
| 84 123 |  | 
| 85 124 | 
             
                  when String
         | 
| 86 125 | 
             
                    @io = FileInputMethod.new(input_method)
         | 
| @@ -91,17 +130,15 @@ module IRB | |
| 91 130 | 
             
                  end
         | 
| 92 131 | 
             
                  self.save_history = IRB.conf[:SAVE_HISTORY] if IRB.conf[:SAVE_HISTORY]
         | 
| 93 132 |  | 
| 94 | 
            -
                  if output_method
         | 
| 95 | 
            -
                    @output_method = output_method
         | 
| 96 | 
            -
                  else
         | 
| 97 | 
            -
                    @output_method = StdioOutputMethod.new
         | 
| 98 | 
            -
                  end
         | 
| 99 | 
            -
             | 
| 100 133 | 
             
                  @echo = IRB.conf[:ECHO]
         | 
| 101 134 | 
             
                  if @echo.nil?
         | 
| 102 135 | 
             
                    @echo = true
         | 
| 103 136 | 
             
                  end
         | 
| 104 | 
            -
             | 
| 137 | 
            +
             | 
| 138 | 
            +
                  @echo_on_assignment = IRB.conf[:ECHO_ON_ASSIGNMENT]
         | 
| 139 | 
            +
                  if @echo_on_assignment.nil?
         | 
| 140 | 
            +
                    @echo_on_assignment = false
         | 
| 141 | 
            +
                  end
         | 
| 105 142 | 
             
                end
         | 
| 106 143 |  | 
| 107 144 | 
             
                # The top-level workspace, see WorkSpace#main
         | 
| @@ -117,9 +154,9 @@ module IRB | |
| 117 154 | 
             
                attr_reader :thread
         | 
| 118 155 | 
             
                # The current input method
         | 
| 119 156 | 
             
                #
         | 
| 120 | 
            -
                # Can be either StdioInputMethod, ReadlineInputMethod, | 
| 121 | 
            -
                # other specified when the | 
| 122 | 
            -
                # information on +input_method+.
         | 
| 157 | 
            +
                # Can be either StdioInputMethod, ReadlineInputMethod,
         | 
| 158 | 
            +
                # ReidlineInputMethod, FileInputMethod or other specified when the
         | 
| 159 | 
            +
                # context is created. See ::new for more # information on +input_method+.
         | 
| 123 160 | 
             
                attr_accessor :io
         | 
| 124 161 |  | 
| 125 162 | 
             
                # Current irb session
         | 
| @@ -137,12 +174,18 @@ module IRB | |
| 137 174 | 
             
                # +input_method+ passed to Context.new
         | 
| 138 175 | 
             
                attr_accessor :irb_path
         | 
| 139 176 |  | 
| 140 | 
            -
                # Whether  | 
| 177 | 
            +
                # Whether multiline editor mode is enabled or not.
         | 
| 178 | 
            +
                #
         | 
| 179 | 
            +
                # A copy of the default <code>IRB.conf[:USE_MULTILINE]</code>
         | 
| 180 | 
            +
                attr_reader :use_multiline
         | 
| 181 | 
            +
                # Whether singleline editor mode is enabled or not.
         | 
| 141 182 | 
             
                #
         | 
| 142 | 
            -
                # A copy of the default <code>IRB.conf[: | 
| 183 | 
            +
                # A copy of the default <code>IRB.conf[:USE_SINGLELINE]</code>
         | 
| 184 | 
            +
                attr_reader :use_singleline
         | 
| 185 | 
            +
                # Whether colorization is enabled or not.
         | 
| 143 186 | 
             
                #
         | 
| 144 | 
            -
                #  | 
| 145 | 
            -
                attr_reader : | 
| 187 | 
            +
                # A copy of the default <code>IRB.conf[:USE_COLORIZE]</code>
         | 
| 188 | 
            +
                attr_reader :use_colorize
         | 
| 146 189 | 
             
                # A copy of the default <code>IRB.conf[:INSPECT_MODE]</code>
         | 
| 147 190 | 
             
                attr_reader :inspect_mode
         | 
| 148 191 |  | 
| @@ -165,17 +208,17 @@ module IRB | |
| 165 208 | 
             
                # Can be either the default <code>IRB.conf[:AUTO_INDENT]</code>, or the
         | 
| 166 209 | 
             
                # mode set by #prompt_mode=
         | 
| 167 210 | 
             
                #
         | 
| 168 | 
            -
                # To  | 
| 211 | 
            +
                # To disable auto-indentation in irb:
         | 
| 169 212 | 
             
                #
         | 
| 170 | 
            -
                #     IRB.conf[:AUTO_INDENT] =  | 
| 213 | 
            +
                #     IRB.conf[:AUTO_INDENT] = false
         | 
| 171 214 | 
             
                #
         | 
| 172 215 | 
             
                # or
         | 
| 173 216 | 
             
                #
         | 
| 174 | 
            -
                #     irb_context.auto_indent_mode =  | 
| 217 | 
            +
                #     irb_context.auto_indent_mode = false
         | 
| 175 218 | 
             
                #
         | 
| 176 219 | 
             
                # or
         | 
| 177 220 | 
             
                #
         | 
| 178 | 
            -
                #     IRB.CurrentContext.auto_indent_mode =  | 
| 221 | 
            +
                #     IRB.CurrentContext.auto_indent_mode = false
         | 
| 179 222 | 
             
                #
         | 
| 180 223 | 
             
                # See IRB@Configuration for more information.
         | 
| 181 224 | 
             
                attr_accessor :auto_indent_mode
         | 
| @@ -207,14 +250,19 @@ module IRB | |
| 207 250 | 
             
                #     puts "omg"
         | 
| 208 251 | 
             
                #     # omg
         | 
| 209 252 | 
             
                attr_accessor :echo
         | 
| 253 | 
            +
                # Whether to echo for assignment expressions
         | 
| 254 | 
            +
                #
         | 
| 255 | 
            +
                # Uses IRB.conf[:ECHO_ON_ASSIGNMENT] if available, or defaults to +false+.
         | 
| 256 | 
            +
                #
         | 
| 257 | 
            +
                #     a = "omg"
         | 
| 258 | 
            +
                #     IRB.CurrentContext.echo_on_assignment = true
         | 
| 259 | 
            +
                #     a = "omg"
         | 
| 260 | 
            +
                #     #=> omg
         | 
| 261 | 
            +
                attr_accessor :echo_on_assignment
         | 
| 210 262 | 
             
                # Whether verbose messages are displayed or not.
         | 
| 211 263 | 
             
                #
         | 
| 212 264 | 
             
                # A copy of the default <code>IRB.conf[:VERBOSE]</code>
         | 
| 213 265 | 
             
                attr_accessor :verbose
         | 
| 214 | 
            -
                # The debug level of irb
         | 
| 215 | 
            -
                #
         | 
| 216 | 
            -
                # See #debug_level= for more information.
         | 
| 217 | 
            -
                attr_reader :debug_level
         | 
| 218 266 |  | 
| 219 267 | 
             
                # The limit of backtrace lines displayed as top +n+ and tail +n+.
         | 
| 220 268 | 
             
                #
         | 
| @@ -225,18 +273,33 @@ module IRB | |
| 225 273 | 
             
                # See IRB@Command+line+options for more command line options.
         | 
| 226 274 | 
             
                attr_accessor :back_trace_limit
         | 
| 227 275 |  | 
| 228 | 
            -
                # Alias for # | 
| 229 | 
            -
                alias  | 
| 276 | 
            +
                # Alias for #use_multiline
         | 
| 277 | 
            +
                alias use_multiline? use_multiline
         | 
| 278 | 
            +
                # Alias for #use_singleline
         | 
| 279 | 
            +
                alias use_singleline? use_singleline
         | 
| 280 | 
            +
                # backward compatibility
         | 
| 281 | 
            +
                alias use_reidline use_multiline
         | 
| 282 | 
            +
                # backward compatibility
         | 
| 283 | 
            +
                alias use_reidline? use_multiline
         | 
| 284 | 
            +
                # backward compatibility
         | 
| 285 | 
            +
                alias use_readline use_singleline
         | 
| 286 | 
            +
                # backward compatibility
         | 
| 287 | 
            +
                alias use_readline? use_singleline
         | 
| 288 | 
            +
                # Alias for #use_colorize
         | 
| 289 | 
            +
                alias use_colorize? use_colorize
         | 
| 230 290 | 
             
                # Alias for #rc
         | 
| 231 291 | 
             
                alias rc? rc
         | 
| 232 292 | 
             
                alias ignore_sigint? ignore_sigint
         | 
| 233 293 | 
             
                alias ignore_eof? ignore_eof
         | 
| 234 294 | 
             
                alias echo? echo
         | 
| 295 | 
            +
                alias echo_on_assignment? echo_on_assignment
         | 
| 235 296 |  | 
| 236 297 | 
             
                # Returns whether messages are displayed or not.
         | 
| 237 298 | 
             
                def verbose?
         | 
| 238 299 | 
             
                  if @verbose.nil?
         | 
| 239 | 
            -
                    if  | 
| 300 | 
            +
                    if @io.kind_of?(ReidlineInputMethod)
         | 
| 301 | 
            +
                      false
         | 
| 302 | 
            +
                    elsif defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
         | 
| 240 303 | 
             
                      false
         | 
| 241 304 | 
             
                    elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
         | 
| 242 305 | 
             
                      true
         | 
| @@ -249,9 +312,11 @@ module IRB | |
| 249 312 | 
             
                end
         | 
| 250 313 |  | 
| 251 314 | 
             
                # Whether #verbose? is +true+, and +input_method+ is either
         | 
| 252 | 
            -
                # StdioInputMethod or ReadlineInputMethod, see #io | 
| 315 | 
            +
                # StdioInputMethod or ReidlineInputMethod or ReadlineInputMethod, see #io
         | 
| 316 | 
            +
                # for more information.
         | 
| 253 317 | 
             
                def prompting?
         | 
| 254 318 | 
             
                  verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
         | 
| 319 | 
            +
                               @io.kind_of?(ReidlineInputMethod) ||
         | 
| 255 320 | 
             
                               (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
         | 
| 256 321 | 
             
                end
         | 
| 257 322 |  | 
| @@ -350,36 +415,11 @@ module IRB | |
| 350 415 | 
             
                  @inspect_mode
         | 
| 351 416 | 
             
                end
         | 
| 352 417 |  | 
| 353 | 
            -
                # Obsolete method.
         | 
| 354 | 
            -
                #
         | 
| 355 | 
            -
                # Can be set using the +--noreadline+ and +--readline+ command line
         | 
| 356 | 
            -
                # options.
         | 
| 357 | 
            -
                #
         | 
| 358 | 
            -
                # See IRB@Command+line+options for more command line options.
         | 
| 359 | 
            -
                def use_readline=(opt)
         | 
| 360 | 
            -
                  print "This method is obsolete."
         | 
| 361 | 
            -
                  print "Do nothing."
         | 
| 362 | 
            -
                end
         | 
| 363 | 
            -
             | 
| 364 | 
            -
                # Sets the debug level of irb
         | 
| 365 | 
            -
                #
         | 
| 366 | 
            -
                # Can also be set using the +--irb_debug+ command line option.
         | 
| 367 | 
            -
                #
         | 
| 368 | 
            -
                # See IRB@Command+line+options for more command line options.
         | 
| 369 | 
            -
                def debug_level=(value)
         | 
| 370 | 
            -
                  @debug_level = value
         | 
| 371 | 
            -
                  RubyLex.debug_level = value
         | 
| 372 | 
            -
                end
         | 
| 373 | 
            -
             | 
| 374 | 
            -
                # Whether or not debug mode is enabled, see #debug_level=.
         | 
| 375 | 
            -
                def debug?
         | 
| 376 | 
            -
                  @debug_level > 0
         | 
| 377 | 
            -
                end
         | 
| 378 | 
            -
             | 
| 379 418 | 
             
                def evaluate(line, line_no, exception: nil) # :nodoc:
         | 
| 380 419 | 
             
                  @line_no = line_no
         | 
| 381 420 | 
             
                  if exception
         | 
| 382 | 
            -
                     | 
| 421 | 
            +
                    line_no -= 1
         | 
| 422 | 
            +
                    line = "begin ::Kernel.raise _; rescue _.class\n#{line}\n""end"
         | 
| 383 423 | 
             
                    @workspace.local_variable_set(:_, exception)
         | 
| 384 424 | 
             
                  end
         | 
| 385 425 | 
             
                  set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
         |