irb 1.14.1 → 1.14.3
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/.document +5 -1
- data/Gemfile +1 -1
- data/README.md +11 -0
- data/Rakefile +0 -2
- data/lib/irb/command/base.rb +3 -7
- data/lib/irb/command/internal_helpers.rb +1 -1
- data/lib/irb/command/ls.rb +23 -11
- data/lib/irb/completion.rb +12 -5
- data/lib/irb/context.rb +20 -6
- data/lib/irb/debug/ui.rb +2 -4
- data/lib/irb/debug.rb +1 -0
- data/lib/irb/easter-egg.rb +2 -1
- data/lib/irb/history.rb +80 -55
- data/lib/irb/init.rb +1 -1
- data/lib/irb/input-method.rb +9 -1
- data/lib/irb/lc/ja/help-message +4 -4
- data/lib/irb/nesting_parser.rb +1 -1
- data/lib/irb/pager.rb +6 -1
- data/lib/irb/source_finder.rb +2 -3
- data/lib/irb/version.rb +2 -2
- data/lib/irb/workspace.rb +6 -26
- data/lib/irb.rb +14 -12
- data/man/irb.1 +35 -2
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3f1a9b1cbe12db08853604fff0b28f7b66ae1e724d54580ce507e15feb9e0f63
         | 
| 4 | 
            +
              data.tar.gz: ce18f088328360ab8d39c4c3902984f0110e704b5a6d953e171d8d35c7b545a8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a3a46b3c4b9b03dd97175f71cb1a41b02482b996f63b98fa1128c91e741dd17eff1c5af6d314c6756050f4b0e92c398aed1a3ad7adac035d1df0c266e8bd8de0
         | 
| 7 | 
            +
              data.tar.gz: 57a389d3e32a394e256beb720d9e124f0f48d9bddb26cc8f4913eba2bb7cdd258f30cda97c87cc3bd028f0501d6247a9cbc97eff7279652805d65cdadef67d4c
         | 
    
        data/.document
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    | @@ -7,7 +7,7 @@ is_truffleruby = RUBY_DESCRIPTION =~ /truffleruby/ | |
| 7 7 |  | 
| 8 8 | 
             
            if is_unix && ENV['WITH_VTERM']
         | 
| 9 9 | 
             
              gem "vterm", github: "ruby/vterm-gem"
         | 
| 10 | 
            -
              gem "yamatanooroti", github: "ruby/yamatanooroti" | 
| 10 | 
            +
              gem "yamatanooroti", github: "ruby/yamatanooroti"
         | 
| 11 11 | 
             
            end
         | 
| 12 12 |  | 
| 13 13 | 
             
            gem "stackprof" if is_unix && !is_truffleruby
         | 
    
        data/README.md
    CHANGED
    
    | @@ -170,6 +170,13 @@ Aliases | |
| 170 170 |  | 
| 171 171 | 
             
            ## Debugging with IRB
         | 
| 172 172 |  | 
| 173 | 
            +
            ### Getting Started
         | 
| 174 | 
            +
             | 
| 175 | 
            +
            - In `binding.irb`, use the `debug` command to start a `irb:rdbg` session with access to all `debug.gem` commands.
         | 
| 176 | 
            +
            - Use `RUBY_DEBUG_IRB_CONSOLE=1` environment variable to make `debug.gem` use IRB as the debugging console.
         | 
| 177 | 
            +
             | 
| 178 | 
            +
            ### Details
         | 
| 179 | 
            +
             | 
| 173 180 | 
             
            Starting from version 1.8.0, IRB boasts a powerful integration with `debug.gem`, providing a debugging experience akin to `pry-byebug`.
         | 
| 174 181 |  | 
| 175 182 | 
             
            After hitting a `binding.irb` breakpoint, you can activate the debugger with the `debug` command. Alternatively, if the `debug` method happens to already be defined in the current scope, you can call `irb_debug`.
         | 
| @@ -354,6 +361,10 @@ irb(main):002> a.first. # Completes Integer methods | |
| 354 361 | 
             
            - `VISUAL`: Its value would be used to open files by the `edit` command.
         | 
| 355 362 | 
             
            - `EDITOR`: Its value would be used to open files by the `edit` command if `VISUAL` is unset.
         | 
| 356 363 | 
             
            - `IRBRC`: The file specified would be evaluated as IRB's rc-file.
         | 
| 364 | 
            +
            - `XDG_CONFIG_HOME`: If it is set and `IRBRC` is unset, the file `$XDG_CONFIG_HOME/irb/irbrc` would be evaluated as IRB's rc-file.
         | 
| 365 | 
            +
            - `RI_PAGER`: The command specified would be used as a pager.
         | 
| 366 | 
            +
            - `PAGER`: The command specified would be used as a pager if `RI_PAGER` is unset.
         | 
| 367 | 
            +
            - `IRB_LANG`, `LC_MESSAGES`, `LC_ALL`, `LANG`: The first of these that is set would be used as the locale value.
         | 
| 357 368 |  | 
| 358 369 | 
             
            ## Documentation
         | 
| 359 370 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -46,8 +46,6 @@ task :default => :test | |
| 46 46 |  | 
| 47 47 | 
             
            RDoc::Task.new do |rdoc|
         | 
| 48 48 | 
             
              rdoc.title = "IRB"
         | 
| 49 | 
            -
              rdoc.rdoc_files.include("*.md", "lib/**/*.rb")
         | 
| 50 | 
            -
              rdoc.rdoc_files.exclude("lib/irb/xmp.rb")
         | 
| 51 49 | 
             
              rdoc.rdoc_dir = "docs"
         | 
| 52 50 | 
             
              rdoc.main = "README.md"
         | 
| 53 51 | 
             
              rdoc.options.push("--copy-files", "LICENSE.txt")
         | 
    
        data/lib/irb/command/base.rb
    CHANGED
    
    | @@ -5,13 +5,11 @@ | |
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            module IRB
         | 
| 8 | 
            -
              # :stopdoc:
         | 
| 9 | 
            -
             | 
| 10 8 | 
             
              module Command
         | 
| 11 | 
            -
                class CommandArgumentError < StandardError; end
         | 
| 9 | 
            +
                class CommandArgumentError < StandardError; end # :nodoc:
         | 
| 12 10 |  | 
| 13 11 | 
             
                class << self
         | 
| 14 | 
            -
                  def extract_ruby_args(*args, **kwargs)
         | 
| 12 | 
            +
                  def extract_ruby_args(*args, **kwargs) # :nodoc:
         | 
| 15 13 | 
             
                    throw :EXTRACT_RUBY_ARGS, [args, kwargs]
         | 
| 16 14 | 
             
                  end
         | 
| 17 15 | 
             
                end
         | 
| @@ -57,8 +55,6 @@ module IRB | |
| 57 55 | 
             
                  end
         | 
| 58 56 | 
             
                end
         | 
| 59 57 |  | 
| 60 | 
            -
                Nop = Base
         | 
| 58 | 
            +
                Nop = Base # :nodoc:
         | 
| 61 59 | 
             
              end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
              # :startdoc:
         | 
| 64 60 | 
             
            end
         | 
| @@ -19,7 +19,7 @@ module IRB | |
| 19 19 | 
             
                    # Use throw and catch to handle arg that includes `;`
         | 
| 20 20 | 
             
                    # For example: "1, kw: (2; 3); 4" will be parsed to [[1], { kw: 3 }]
         | 
| 21 21 | 
             
                    catch(:EXTRACT_RUBY_ARGS) do
         | 
| 22 | 
            -
                      @irb_context.workspace.binding.eval "IRB::Command.extract_ruby_args #{arg}"
         | 
| 22 | 
            +
                      @irb_context.workspace.binding.eval "::IRB::Command.extract_ruby_args #{arg}"
         | 
| 23 23 | 
             
                    end || [[], {}]
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
    
        data/lib/irb/command/ls.rb
    CHANGED
    
    | @@ -11,7 +11,7 @@ module IRB | |
| 11 11 |  | 
| 12 12 | 
             
              module Command
         | 
| 13 13 | 
             
                class Ls < Base
         | 
| 14 | 
            -
                   | 
| 14 | 
            +
                  class EvaluationError < StandardError; end
         | 
| 15 15 |  | 
| 16 16 | 
             
                  category "Context"
         | 
| 17 17 | 
             
                  description "Show methods, constants, and variables."
         | 
| @@ -22,24 +22,35 @@ module IRB | |
| 22 22 | 
             
                      -g [query]  Filter the output with a query.
         | 
| 23 23 | 
             
                  HELP_MESSAGE
         | 
| 24 24 |  | 
| 25 | 
            +
                  def evaluate(code)
         | 
| 26 | 
            +
                    @irb_context.workspace.binding.eval(code)
         | 
| 27 | 
            +
                  rescue Exception => e
         | 
| 28 | 
            +
                    puts "#{e.class}: #{e.message}"
         | 
| 29 | 
            +
                    raise EvaluationError
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 25 32 | 
             
                  def execute(arg)
         | 
| 26 33 | 
             
                    if match = arg.match(/\A(?<target>.+\s|)(-g|-G)\s+(?<grep>.+)$/)
         | 
| 27 | 
            -
                       | 
| 28 | 
            -
                        use_main = true
         | 
| 29 | 
            -
                      else
         | 
| 30 | 
            -
                        obj = @irb_context.workspace.binding.eval(match[:target])
         | 
| 31 | 
            -
                      end
         | 
| 34 | 
            +
                      target = match[:target]
         | 
| 32 35 | 
             
                      grep = Regexp.new(match[:grep])
         | 
| 36 | 
            +
                    elsif match = arg.match(/\A((?<target>.+),|)\s*grep:(?<grep>.+)/)
         | 
| 37 | 
            +
                      # Legacy style `ls obj, grep: /regexp/`
         | 
| 38 | 
            +
                      # Evaluation order should be eval(target) then eval(grep)
         | 
| 39 | 
            +
                      target = match[:target] || ''
         | 
| 40 | 
            +
                      grep_regexp_code = match[:grep]
         | 
| 33 41 | 
             
                    else
         | 
| 34 | 
            -
                       | 
| 35 | 
            -
                      use_main = args.empty?
         | 
| 36 | 
            -
                      obj = args.first
         | 
| 37 | 
            -
                      grep = kwargs[:grep]
         | 
| 42 | 
            +
                      target = arg.strip
         | 
| 38 43 | 
             
                    end
         | 
| 39 44 |  | 
| 40 | 
            -
                    if  | 
| 45 | 
            +
                    if target.empty?
         | 
| 41 46 | 
             
                      obj = irb_context.workspace.main
         | 
| 42 47 | 
             
                      locals = irb_context.workspace.binding.local_variables
         | 
| 48 | 
            +
                    else
         | 
| 49 | 
            +
                      obj = evaluate(target)
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    if grep_regexp_code
         | 
| 53 | 
            +
                      grep = evaluate(grep_regexp_code)
         | 
| 43 54 | 
             
                    end
         | 
| 44 55 |  | 
| 45 56 | 
             
                    o = Output.new(grep: grep)
         | 
| @@ -52,6 +63,7 @@ module IRB | |
| 52 63 | 
             
                    o.dump("class variables", klass.class_variables)
         | 
| 53 64 | 
             
                    o.dump("locals", locals) if locals
         | 
| 54 65 | 
             
                    o.print_result
         | 
| 66 | 
            +
                  rescue EvaluationError
         | 
| 55 67 | 
             
                  end
         | 
| 56 68 |  | 
| 57 69 | 
             
                  def dump_methods(o, klass, obj)
         | 
    
        data/lib/irb/completion.rb
    CHANGED
    
    | @@ -137,26 +137,33 @@ module IRB | |
| 137 137 | 
             
              end
         | 
| 138 138 |  | 
| 139 139 | 
             
              class RegexpCompletor < BaseCompletor # :nodoc:
         | 
| 140 | 
            +
                KERNEL_METHODS = ::Kernel.instance_method(:methods)
         | 
| 141 | 
            +
                KERNEL_PRIVATE_METHODS = ::Kernel.instance_method(:private_methods)
         | 
| 142 | 
            +
                KERNEL_INSTANCE_VARIABLES = ::Kernel.instance_method(:instance_variables)
         | 
| 143 | 
            +
                OBJECT_CLASS_INSTANCE_METHOD = ::Object.instance_method(:class)
         | 
| 144 | 
            +
                MODULE_CONSTANTS_INSTANCE_METHOD = ::Module.instance_method(:constants)
         | 
| 145 | 
            +
             | 
| 140 146 | 
             
                using Module.new {
         | 
| 141 147 | 
             
                  refine ::Binding do
         | 
| 142 148 | 
             
                    def eval_methods
         | 
| 143 | 
            -
                       | 
| 149 | 
            +
                      KERNEL_METHODS.bind_call(receiver)
         | 
| 144 150 | 
             
                    end
         | 
| 145 151 |  | 
| 146 152 | 
             
                    def eval_private_methods
         | 
| 147 | 
            -
                       | 
| 153 | 
            +
                      KERNEL_PRIVATE_METHODS.bind_call(receiver)
         | 
| 148 154 | 
             
                    end
         | 
| 149 155 |  | 
| 150 156 | 
             
                    def eval_instance_variables
         | 
| 151 | 
            -
                       | 
| 157 | 
            +
                      KERNEL_INSTANCE_VARIABLES.bind_call(receiver)
         | 
| 152 158 | 
             
                    end
         | 
| 153 159 |  | 
| 154 160 | 
             
                    def eval_global_variables
         | 
| 155 | 
            -
                      ::Kernel. | 
| 161 | 
            +
                      ::Kernel.global_variables
         | 
| 156 162 | 
             
                    end
         | 
| 157 163 |  | 
| 158 164 | 
             
                    def eval_class_constants
         | 
| 159 | 
            -
                       | 
| 165 | 
            +
                      klass = OBJECT_CLASS_INSTANCE_METHOD.bind_call(receiver)
         | 
| 166 | 
            +
                      MODULE_CONSTANTS_INSTANCE_METHOD.bind_call(klass)
         | 
| 160 167 | 
             
                    end
         | 
| 161 168 | 
             
                  end
         | 
| 162 169 | 
             
                }
         | 
    
        data/lib/irb/context.rb
    CHANGED
    
    | @@ -13,6 +13,9 @@ module IRB | |
| 13 13 | 
             
              # A class that wraps the current state of the irb session, including the
         | 
| 14 14 | 
             
              # configuration of IRB.conf.
         | 
| 15 15 | 
             
              class Context
         | 
| 16 | 
            +
                KERNEL_PUBLIC_METHOD = ::Kernel.instance_method(:public_method)
         | 
| 17 | 
            +
                KERNEL_METHOD = ::Kernel.instance_method(:method)
         | 
| 18 | 
            +
             | 
| 16 19 | 
             
                ASSIGN_OPERATORS_REGEXP = Regexp.union(%w[= += -= *= /= %= **= &= |= &&= ||= ^= <<= >>=])
         | 
| 17 20 | 
             
                # Creates a new IRB context.
         | 
| 18 21 | 
             
                #
         | 
| @@ -176,11 +179,17 @@ module IRB | |
| 176 179 |  | 
| 177 180 | 
             
                private def build_completor
         | 
| 178 181 | 
             
                  completor_type = IRB.conf[:COMPLETOR]
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                  # Gem repl_type_completor is added to bundled gems in Ruby 3.4.
         | 
| 184 | 
            +
                  # Use :type as default completor only in Ruby 3.4 or later.
         | 
| 185 | 
            +
                  verbose = !!completor_type
         | 
| 186 | 
            +
                  completor_type ||= RUBY_VERSION >= '3.4' ? :type : :regexp
         | 
| 187 | 
            +
             | 
| 179 188 | 
             
                  case completor_type
         | 
| 180 189 | 
             
                  when :regexp
         | 
| 181 190 | 
             
                    return RegexpCompletor.new
         | 
| 182 191 | 
             
                  when :type
         | 
| 183 | 
            -
                    completor = build_type_completor
         | 
| 192 | 
            +
                    completor = build_type_completor(verbose: verbose)
         | 
| 184 193 | 
             
                    return completor if completor
         | 
| 185 194 | 
             
                  else
         | 
| 186 195 | 
             
                    warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}"
         | 
| @@ -189,17 +198,17 @@ module IRB | |
| 189 198 | 
             
                  RegexpCompletor.new
         | 
| 190 199 | 
             
                end
         | 
| 191 200 |  | 
| 192 | 
            -
                private def build_type_completor
         | 
| 201 | 
            +
                private def build_type_completor(verbose:)
         | 
| 193 202 | 
             
                  if RUBY_ENGINE == 'truffleruby'
         | 
| 194 203 | 
             
                    # Avoid SyntaxError. truffleruby does not support endless method definition yet.
         | 
| 195 | 
            -
                    warn 'TypeCompletor is not supported on TruffleRuby yet'
         | 
| 204 | 
            +
                    warn 'TypeCompletor is not supported on TruffleRuby yet' if verbose
         | 
| 196 205 | 
             
                    return
         | 
| 197 206 | 
             
                  end
         | 
| 198 207 |  | 
| 199 208 | 
             
                  begin
         | 
| 200 209 | 
             
                    require 'repl_type_completor'
         | 
| 201 210 | 
             
                  rescue LoadError => e
         | 
| 202 | 
            -
                    warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}"
         | 
| 211 | 
            +
                    warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}" if verbose
         | 
| 203 212 | 
             
                    return
         | 
| 204 213 | 
             
                  end
         | 
| 205 214 |  | 
| @@ -642,8 +651,8 @@ module IRB | |
| 642 651 | 
             
                  return if local_variables.include?(command)
         | 
| 643 652 |  | 
| 644 653 | 
             
                  # Check visibility
         | 
| 645 | 
            -
                  public_method = !! | 
| 646 | 
            -
                  private_method = !public_method && !! | 
| 654 | 
            +
                  public_method = !!KERNEL_PUBLIC_METHOD.bind_call(main, command) rescue false
         | 
| 655 | 
            +
                  private_method = !public_method && !!KERNEL_METHOD.bind_call(main, command) rescue false
         | 
| 647 656 | 
             
                  if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
         | 
| 648 657 | 
             
                    [command, arg]
         | 
| 649 658 | 
             
                  end
         | 
| @@ -698,5 +707,10 @@ module IRB | |
| 698 707 | 
             
                def local_variables # :nodoc:
         | 
| 699 708 | 
             
                  workspace.binding.local_variables
         | 
| 700 709 | 
             
                end
         | 
| 710 | 
            +
             | 
| 711 | 
            +
                def safe_method_call_on_main(method_name)
         | 
| 712 | 
            +
                  main_object = main
         | 
| 713 | 
            +
                  Object === main_object ? main_object.__send__(method_name) : Object.instance_method(method_name).bind_call(main_object)
         | 
| 714 | 
            +
                end
         | 
| 701 715 | 
             
              end
         | 
| 702 716 | 
             
            end
         | 
    
        data/lib/irb/debug/ui.rb
    CHANGED
    
    | @@ -45,9 +45,7 @@ module IRB | |
| 45 45 | 
             
                        $stdout.puts line.chomp
         | 
| 46 46 | 
             
                      }
         | 
| 47 47 | 
             
                    when String
         | 
| 48 | 
            -
                      str | 
| 49 | 
            -
                        $stdout.puts line.chomp
         | 
| 50 | 
            -
                      }
         | 
| 48 | 
            +
                      Pager.page_content(str, retain_content: true)
         | 
| 51 49 | 
             
                    when nil
         | 
| 52 50 | 
             
                      $stdout.puts
         | 
| 53 51 | 
             
                    end
         | 
| @@ -56,7 +54,7 @@ module IRB | |
| 56 54 | 
             
                  def readline _
         | 
| 57 55 | 
             
                    setup_interrupt do
         | 
| 58 56 | 
             
                      tc = DEBUGGER__::SESSION.instance_variable_get(:@tc)
         | 
| 59 | 
            -
                      cmd = @irb.debug_readline(tc.current_frame. | 
| 57 | 
            +
                      cmd = @irb.debug_readline(tc.current_frame.eval_binding || TOPLEVEL_BINDING)
         | 
| 60 58 |  | 
| 61 59 | 
             
                      case cmd
         | 
| 62 60 | 
             
                      when nil # when user types C-d
         | 
    
        data/lib/irb/debug.rb
    CHANGED
    
    
    
        data/lib/irb/easter-egg.rb
    CHANGED
    
    | @@ -125,7 +125,7 @@ module IRB | |
| 125 125 | 
             
                        canvas = Canvas.new(Reline.get_screen_size)
         | 
| 126 126 | 
             
                      end
         | 
| 127 127 | 
             
                      ruby_model = RubyModel.new
         | 
| 128 | 
            -
                      print "\e[? | 
| 128 | 
            +
                      print "\e[?25l" # hide cursor
         | 
| 129 129 | 
             
                      0.step do |i| # TODO (0..).each needs Ruby 2.6 or later
         | 
| 130 130 | 
             
                        buff = canvas.draw do
         | 
| 131 131 | 
             
                          ruby_model.render_frame(i) do |p1, p2|
         | 
| @@ -139,6 +139,7 @@ module IRB | |
| 139 139 | 
             
                      end
         | 
| 140 140 | 
             
                    rescue Interrupt
         | 
| 141 141 | 
             
                    ensure
         | 
| 142 | 
            +
                      print "\e[?25h" # show cursor
         | 
| 142 143 | 
             
                      trap("SIGINT", prev_trap)
         | 
| 143 144 | 
             
                    end
         | 
| 144 145 | 
             
                  end
         | 
    
        data/lib/irb/history.rb
    CHANGED
    
    | @@ -1,6 +1,32 @@ | |
| 1 1 | 
             
            require "pathname"
         | 
| 2 2 |  | 
| 3 3 | 
             
            module IRB
         | 
| 4 | 
            +
              module History
         | 
| 5 | 
            +
                class << self
         | 
| 6 | 
            +
                  # Integer representation of <code>IRB.conf[:HISTORY_FILE]</code>.
         | 
| 7 | 
            +
                  def save_history
         | 
| 8 | 
            +
                    IRB.conf[:SAVE_HISTORY].to_i
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def save_history?
         | 
| 12 | 
            +
                    !save_history.zero?
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def infinite?
         | 
| 16 | 
            +
                    save_history.negative?
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  # Might be nil when HOME and XDG_CONFIG_HOME are not available.
         | 
| 20 | 
            +
                  def history_file
         | 
| 21 | 
            +
                    if (history_file = IRB.conf[:HISTORY_FILE])
         | 
| 22 | 
            +
                      File.expand_path(history_file)
         | 
| 23 | 
            +
                    else
         | 
| 24 | 
            +
                      IRB.rc_file("_history")
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 4 30 | 
             
              module HistorySavingAbility # :nodoc:
         | 
| 5 31 | 
             
                def support_history_saving?
         | 
| 6 32 | 
             
                  true
         | 
| @@ -11,76 +37,75 @@ module IRB | |
| 11 37 | 
             
                end
         | 
| 12 38 |  | 
| 13 39 | 
             
                def load_history
         | 
| 40 | 
            +
                  history_file = History.history_file
         | 
| 41 | 
            +
                  return unless File.exist?(history_file.to_s)
         | 
| 42 | 
            +
             | 
| 14 43 | 
             
                  history = self.class::HISTORY
         | 
| 15 44 |  | 
| 16 | 
            -
                   | 
| 17 | 
            -
                     | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                       | 
| 23 | 
            -
                         | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                          history.last << "\n" << l
         | 
| 27 | 
            -
                        else
         | 
| 28 | 
            -
                          history << l
         | 
| 29 | 
            -
                        end
         | 
| 30 | 
            -
                      }
         | 
| 31 | 
            -
                    end
         | 
| 32 | 
            -
                    @loaded_history_lines = history.size
         | 
| 33 | 
            -
                    @loaded_history_mtime = File.mtime(history_file)
         | 
| 45 | 
            +
                  File.open(history_file, "r:#{IRB.conf[:LC_MESSAGES].encoding}") do |f|
         | 
| 46 | 
            +
                    f.each { |l|
         | 
| 47 | 
            +
                      l = l.chomp
         | 
| 48 | 
            +
                      if self.class == RelineInputMethod and history.last&.end_with?("\\")
         | 
| 49 | 
            +
                        history.last.delete_suffix!("\\")
         | 
| 50 | 
            +
                        history.last << "\n" << l
         | 
| 51 | 
            +
                      else
         | 
| 52 | 
            +
                        history << l
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
                    }
         | 
| 34 55 | 
             
                  end
         | 
| 56 | 
            +
                  @loaded_history_lines = history.size
         | 
| 57 | 
            +
                  @loaded_history_mtime = File.mtime(history_file)
         | 
| 35 58 | 
             
                end
         | 
| 36 59 |  | 
| 37 60 | 
             
                def save_history
         | 
| 61 | 
            +
                  return unless History.save_history?
         | 
| 62 | 
            +
                  return unless (history_file = History.history_file)
         | 
| 63 | 
            +
                  unless ensure_history_file_writable(history_file)
         | 
| 64 | 
            +
                    warn <<~WARN
         | 
| 65 | 
            +
                      Can't write history to #{History.history_file.inspect} due to insufficient permissions.
         | 
| 66 | 
            +
                      Please verify the value of `IRB.conf[:HISTORY_FILE]`. Ensure the folder exists and that both the folder and file (if it exists) are writable.
         | 
| 67 | 
            +
                    WARN
         | 
| 68 | 
            +
                    return
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 38 71 | 
             
                  history = self.class::HISTORY.to_a
         | 
| 39 72 |  | 
| 40 | 
            -
                  if  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                     | 
| 44 | 
            -
             | 
| 73 | 
            +
                  if File.exist?(history_file) &&
         | 
| 74 | 
            +
                      File.mtime(history_file) != @loaded_history_mtime
         | 
| 75 | 
            +
                    history = history[@loaded_history_lines..-1] if @loaded_history_lines
         | 
| 76 | 
            +
                    append_history = true
         | 
| 77 | 
            +
                  end
         | 
| 45 78 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
                     | 
| 79 | 
            +
                  File.open(history_file, (append_history ? "a" : "w"), 0o600, encoding: IRB.conf[:LC_MESSAGES]&.encoding) do |f|
         | 
| 80 | 
            +
                    hist = history.map { |l| l.scrub.split("\n").join("\\\n") }
         | 
| 48 81 |  | 
| 49 | 
            -
                     | 
| 50 | 
            -
             | 
| 51 | 
            -
                       | 
| 52 | 
            -
                        File.chmod(0600, history_file)
         | 
| 53 | 
            -
                      end
         | 
| 54 | 
            -
                    rescue Errno::ENOENT
         | 
| 55 | 
            -
                    rescue Errno::EPERM
         | 
| 56 | 
            -
                      return
         | 
| 57 | 
            -
                    rescue
         | 
| 58 | 
            -
                      raise
         | 
| 82 | 
            +
                    unless append_history || History.infinite?
         | 
| 83 | 
            +
                      # Check size before slicing because array.last(huge_number) raises RangeError.
         | 
| 84 | 
            +
                      hist = hist.last(History.save_history) if hist.size > History.save_history
         | 
| 59 85 | 
             
                    end
         | 
| 60 86 |  | 
| 61 | 
            -
                     | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
                      append_history = true
         | 
| 65 | 
            -
                    end
         | 
| 87 | 
            +
                    f.puts(hist)
         | 
| 88 | 
            +
                  end
         | 
| 89 | 
            +
                end
         | 
| 66 90 |  | 
| 67 | 
            -
             | 
| 68 | 
            -
                    unless Dir.exist?(pathname.dirname)
         | 
| 69 | 
            -
                      warn "Warning: The directory to save IRB's history file does not exist. Please double check `IRB.conf[:HISTORY_FILE]`'s value."
         | 
| 70 | 
            -
                      return
         | 
| 71 | 
            -
                    end
         | 
| 91 | 
            +
                private
         | 
| 72 92 |  | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 93 | 
            +
                # Returns boolean whether writing to +history_file+ will be possible.
         | 
| 94 | 
            +
                # Permissions of already existing +history_file+ are changed to
         | 
| 95 | 
            +
                # owner-only-readable if necessary [BUG #7694].
         | 
| 96 | 
            +
                def ensure_history_file_writable(history_file)
         | 
| 97 | 
            +
                  history_file = Pathname.new(history_file)
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  return false unless history_file.dirname.writable?
         | 
| 100 | 
            +
                  return true unless history_file.exist?
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  begin
         | 
| 103 | 
            +
                    if history_file.stat.mode & 0o66 != 0
         | 
| 104 | 
            +
                      history_file.chmod 0o600
         | 
| 83 105 | 
             
                    end
         | 
| 106 | 
            +
                    true
         | 
| 107 | 
            +
                  rescue Errno::EPERM # no permissions
         | 
| 108 | 
            +
                    false
         | 
| 84 109 | 
             
                  end
         | 
| 85 110 | 
             
                end
         | 
| 86 111 | 
             
              end
         | 
    
        data/lib/irb/init.rb
    CHANGED
    
    | @@ -80,7 +80,7 @@ module IRB # :nodoc: | |
| 80 80 | 
             
                @CONF[:USE_SINGLELINE] = false unless defined?(ReadlineInputMethod)
         | 
| 81 81 | 
             
                @CONF[:USE_COLORIZE] = (nc = ENV['NO_COLOR']).nil? || nc.empty?
         | 
| 82 82 | 
             
                @CONF[:USE_AUTOCOMPLETE] = ENV.fetch("IRB_USE_AUTOCOMPLETE", "true") != "false"
         | 
| 83 | 
            -
                @CONF[:COMPLETOR] = ENV | 
| 83 | 
            +
                @CONF[:COMPLETOR] = ENV["IRB_COMPLETOR"]&.to_sym
         | 
| 84 84 | 
             
                @CONF[:INSPECT_MODE] = true
         | 
| 85 85 | 
             
                @CONF[:USE_TRACER] = false
         | 
| 86 86 | 
             
                @CONF[:USE_LOADER] = false
         | 
    
        data/lib/irb/input-method.rb
    CHANGED
    
    | @@ -67,7 +67,9 @@ module IRB | |
| 67 67 | 
             
                #
         | 
| 68 68 | 
             
                # See IO#gets for more information.
         | 
| 69 69 | 
             
                def gets
         | 
| 70 | 
            -
                   | 
| 70 | 
            +
                  # Workaround for debug compatibility test https://github.com/ruby/debug/pull/1100
         | 
| 71 | 
            +
                  puts if ENV['RUBY_DEBUG_TEST_UI']
         | 
| 72 | 
            +
             | 
| 71 73 | 
             
                  print @prompt
         | 
| 72 74 | 
             
                  line = @stdin.gets
         | 
| 73 75 | 
             
                  @line[@line_no += 1] = line
         | 
| @@ -346,9 +348,15 @@ module IRB | |
| 346 348 | 
             
                      if show_easter_egg
         | 
| 347 349 | 
             
                        IRB.__send__(:easter_egg)
         | 
| 348 350 | 
             
                      else
         | 
| 351 | 
            +
                        # RDoc::RI::Driver#display_names uses pager command internally.
         | 
| 352 | 
            +
                        # Some pager command like `more` doesn't use alternate screen
         | 
| 353 | 
            +
                        # so we need to turn on and off alternate screen manually.
         | 
| 349 354 | 
             
                        begin
         | 
| 355 | 
            +
                          print "\e[?1049h"
         | 
| 350 356 | 
             
                          driver.display_names([name])
         | 
| 351 357 | 
             
                        rescue RDoc::RI::Driver::NotFoundError
         | 
| 358 | 
            +
                        ensure
         | 
| 359 | 
            +
                          print "\e[?1049l"
         | 
| 352 360 | 
             
                        end
         | 
| 353 361 | 
             
                      end
         | 
| 354 362 | 
             
                    end
         | 
    
        data/lib/irb/lc/ja/help-message
    CHANGED
    
    | @@ -8,7 +8,7 @@ Usage:  irb.rb [options] [programfile] [arguments] | |
| 8 8 | 
             
              -w                ruby -w と同じ.
         | 
| 9 9 | 
             
              -W[level=2]       ruby -W と同じ.
         | 
| 10 10 | 
             
              --context-mode n  新しいワークスペースを作成した時に関連する Binding
         | 
| 11 | 
            -
            		    オブジェクトの作成方法を 0 から  | 
| 11 | 
            +
            		    オブジェクトの作成方法を 0 から 4 のいずれかに設定する.
         | 
| 12 12 | 
             
              --extra-doc-dir   指定したディレクトリのドキュメントを追加で読み込む.
         | 
| 13 13 | 
             
              --echo	    実行結果を表示する(デフォルト).
         | 
| 14 14 | 
             
              --noecho	    実行結果を表示しない.
         | 
| @@ -33,9 +33,9 @@ Usage:  irb.rb [options] [programfile] [arguments] | |
| 33 33 | 
             
                                補完に正規表現を利用する.
         | 
| 34 34 | 
             
              --type-completor  補完に型情報を利用する.
         | 
| 35 35 | 
             
              --prompt prompt-mode/--prompt-mode prompt-mode
         | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 36 | 
            +
                                プロンプトモードを切り替える.
         | 
| 37 | 
            +
                                現在定義されているプロンプトモードは,
         | 
| 38 | 
            +
                                default, classic, simple, inf-ruby, xmp, null.
         | 
| 39 39 | 
             
              --inf-ruby-mode   emacsのinf-ruby-mode用のプロンプト表示を行なう. 特
         | 
| 40 40 | 
             
                                に指定がない限り, シングルラインエディタとマルチラ
         | 
| 41 41 | 
             
                                インエディタは使わなくなる.
         | 
    
        data/lib/irb/nesting_parser.rb
    CHANGED
    
    | @@ -159,7 +159,7 @@ module IRB | |
| 159 159 | 
             
                        when :on_heredoc_end
         | 
| 160 160 | 
             
                          opens.pop
         | 
| 161 161 | 
             
                        when :on_backtick
         | 
| 162 | 
            -
                          opens << [t, nil]  | 
| 162 | 
            +
                          opens << [t, nil] unless t.state == Ripper::EXPR_ARG
         | 
| 163 163 | 
             
                        when :on_tstring_beg, :on_words_beg, :on_qwords_beg, :on_symbols_beg, :on_qsymbols_beg, :on_regexp_beg
         | 
| 164 164 | 
             
                          opens << [t, nil]
         | 
| 165 165 | 
             
                        when :on_tstring_end, :on_regexp_end, :on_label_end
         | 
    
        data/lib/irb/pager.rb
    CHANGED
    
    | @@ -34,7 +34,12 @@ module IRB | |
| 34 34 | 
             
                  # So to properly terminate the pager with Ctrl-C, we need to catch `IRB::Abort` and kill the pager process
         | 
| 35 35 | 
             
                  rescue IRB::Abort
         | 
| 36 36 | 
             
                    begin
         | 
| 37 | 
            -
                       | 
| 37 | 
            +
                      begin
         | 
| 38 | 
            +
                        Process.kill("TERM", pid) if pid
         | 
| 39 | 
            +
                      rescue Errno::EINVAL
         | 
| 40 | 
            +
                        # SIGTERM not supported (windows)
         | 
| 41 | 
            +
                        Process.kill("KILL", pid)
         | 
| 42 | 
            +
                      end
         | 
| 38 43 | 
             
                    rescue Errno::ESRCH
         | 
| 39 44 | 
             
                      # Pager process already terminated
         | 
| 40 45 | 
             
                    end
         | 
    
        data/lib/irb/source_finder.rb
    CHANGED
    
    | @@ -125,9 +125,8 @@ module IRB | |
| 125 125 | 
             
                end
         | 
| 126 126 |  | 
| 127 127 | 
             
                def eval_receiver_or_owner(code)
         | 
| 128 | 
            -
                   | 
| 129 | 
            -
             | 
| 130 | 
            -
                rescue NameError
         | 
| 128 | 
            +
                  @irb_context.workspace.binding.eval(code)
         | 
| 129 | 
            +
                rescue Exception
         | 
| 131 130 | 
             
                  raise EvaluationError
         | 
| 132 131 | 
             
                end
         | 
| 133 132 |  | 
    
        data/lib/irb/version.rb
    CHANGED
    
    
    
        data/lib/irb/workspace.rb
    CHANGED
    
    | @@ -4,8 +4,6 @@ | |
| 4 4 | 
             
            #   	by Keiju ISHITSUKA(keiju@ruby-lang.org)
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 | 
            -
            require "delegate"
         | 
| 8 | 
            -
             | 
| 9 7 | 
             
            require_relative "helper_method"
         | 
| 10 8 |  | 
| 11 9 | 
             
            IRB::TOPLEVEL_BINDING = binding
         | 
| @@ -16,7 +14,7 @@ module IRB # :nodoc: | |
| 16 14 | 
             
                # set self to main if specified, otherwise
         | 
| 17 15 | 
             
                # inherit main from TOPLEVEL_BINDING.
         | 
| 18 16 | 
             
                def initialize(*main)
         | 
| 19 | 
            -
                  if main[0] | 
| 17 | 
            +
                  if Binding === main[0]
         | 
| 20 18 | 
             
                    @binding = main.shift
         | 
| 21 19 | 
             
                  elsif IRB.conf[:SINGLE_IRB]
         | 
| 22 20 | 
             
                    @binding = TOPLEVEL_BINDING
         | 
| @@ -70,37 +68,16 @@ EOF | |
| 70 68 | 
             
                  unless main.empty?
         | 
| 71 69 | 
             
                    case @main
         | 
| 72 70 | 
             
                    when Module
         | 
| 73 | 
            -
                      @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
         | 
| 71 | 
            +
                      @binding = eval("::IRB.conf[:__MAIN__].module_eval('::Kernel.binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
         | 
| 74 72 | 
             
                    else
         | 
| 75 73 | 
             
                      begin
         | 
| 76 | 
            -
                        @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
         | 
| 74 | 
            +
                        @binding = eval("::IRB.conf[:__MAIN__].instance_eval('::Kernel.binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
         | 
| 77 75 | 
             
                      rescue TypeError
         | 
| 78 76 | 
             
                        fail CantChangeBinding, @main.inspect
         | 
| 79 77 | 
             
                      end
         | 
| 80 78 | 
             
                    end
         | 
| 81 79 | 
             
                  end
         | 
| 82 80 |  | 
| 83 | 
            -
                  case @main
         | 
| 84 | 
            -
                  when Object
         | 
| 85 | 
            -
                    use_delegator = @main.frozen?
         | 
| 86 | 
            -
                  else
         | 
| 87 | 
            -
                    use_delegator = true
         | 
| 88 | 
            -
                  end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                  if use_delegator
         | 
| 91 | 
            -
                    @main = SimpleDelegator.new(@main)
         | 
| 92 | 
            -
                    IRB.conf[:__MAIN__] = @main
         | 
| 93 | 
            -
                    @main.singleton_class.class_eval do
         | 
| 94 | 
            -
                      private
         | 
| 95 | 
            -
                      define_method(:binding, Kernel.instance_method(:binding))
         | 
| 96 | 
            -
                      define_method(:local_variables, Kernel.instance_method(:local_variables))
         | 
| 97 | 
            -
                      # Define empty method to avoid delegator warning, will be overridden.
         | 
| 98 | 
            -
                      define_method(:exit) {|*a, &b| }
         | 
| 99 | 
            -
                      define_method(:exit!) {|*a, &b| }
         | 
| 100 | 
            -
                    end
         | 
| 101 | 
            -
                    @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
         | 
| 102 | 
            -
                  end
         | 
| 103 | 
            -
             | 
| 104 81 | 
             
                  @binding.local_variable_set(:_, nil)
         | 
| 105 82 | 
             
                end
         | 
| 106 83 |  | 
| @@ -111,6 +88,9 @@ EOF | |
| 111 88 | 
             
                attr_reader :main
         | 
| 112 89 |  | 
| 113 90 | 
             
                def load_helper_methods_to_main
         | 
| 91 | 
            +
                  # Do not load helper methods to frozen objects and BasicObject
         | 
| 92 | 
            +
                  return unless Object === @main && !@main.frozen?
         | 
| 93 | 
            +
             | 
| 114 94 | 
             
                  ancestors = class<<main;ancestors;end
         | 
| 115 95 | 
             
                  main.extend ExtendCommandBundle if !ancestors.include?(ExtendCommandBundle)
         | 
| 116 96 | 
             
                  main.extend HelpersContainer if !ancestors.include?(HelpersContainer)
         | 
    
        data/lib/irb.rb
    CHANGED
    
    | @@ -14,6 +14,7 @@ require_relative "irb/default_commands" | |
| 14 14 |  | 
| 15 15 | 
             
            require_relative "irb/ruby-lex"
         | 
| 16 16 | 
             
            require_relative "irb/statement"
         | 
| 17 | 
            +
            require_relative "irb/history"
         | 
| 17 18 | 
             
            require_relative "irb/input-method"
         | 
| 18 19 | 
             
            require_relative "irb/locale"
         | 
| 19 20 | 
             
            require_relative "irb/color"
         | 
| @@ -74,7 +75,7 @@ require_relative "irb/pager" | |
| 74 75 | 
             
            # 2.  Constructs the initial session context from [hash
         | 
| 75 76 | 
             
            #     IRB.conf](rdoc-ref:IRB@Hash+IRB.conf) and from default values; the hash
         | 
| 76 77 | 
             
            #     content may have been affected by [command-line
         | 
| 77 | 
            -
            #     options](rdoc-ref: | 
| 78 | 
            +
            #     options](rdoc-ref:IRB@Command-Line+Options), and by direct assignments in
         | 
| 78 79 | 
             
            #     the configuration file.
         | 
| 79 80 | 
             
            # 3.  Assigns the context to variable `conf`.
         | 
| 80 81 | 
             
            # 4.  Assigns command-line arguments to variable `ARGV`.
         | 
| @@ -220,11 +221,11 @@ require_relative "irb/pager" | |
| 220 221 | 
             
            # *new_filepath*, which becomes the history file for the session.
         | 
| 221 222 | 
             
            #
         | 
| 222 223 | 
             
            # You can change the number of commands saved by adding to your configuration
         | 
| 223 | 
            -
            # file: `IRB.conf[:SAVE_HISTORY] = *n*`,  | 
| 224 | 
            +
            # file: `IRB.conf[:SAVE_HISTORY] = *n*`, where *n* is one of:
         | 
| 224 225 | 
             
            #
         | 
| 225 | 
            -
            # *   Positive integer: the number of commands to be saved | 
| 226 | 
            -
            # *    | 
| 227 | 
            -
            # *   `nil`: no commands are to be saved | 
| 226 | 
            +
            # *   Positive integer: the number of commands to be saved.
         | 
| 227 | 
            +
            # *   Negative integer: all commands are to be saved.
         | 
| 228 | 
            +
            # *   Zero or `nil`: no commands are to be saved.
         | 
| 228 229 | 
             
            #
         | 
| 229 230 | 
             
            #
         | 
| 230 231 | 
             
            # During the session, you can use methods `conf.save_history` or
         | 
| @@ -878,7 +879,7 @@ require_relative "irb/pager" | |
| 878 879 | 
             
            module IRB
         | 
| 879 880 |  | 
| 880 881 | 
             
              # An exception raised by IRB.irb_abort
         | 
| 881 | 
            -
              class Abort < Exception;end
         | 
| 882 | 
            +
              class Abort < Exception;end # :nodoc:
         | 
| 882 883 |  | 
| 883 884 | 
             
              class << self
         | 
| 884 885 | 
             
                # The current IRB::Context of the session, see IRB.conf
         | 
| @@ -972,7 +973,7 @@ module IRB | |
| 972 973 | 
             
                  # debugger.
         | 
| 973 974 | 
             
                  input = nil
         | 
| 974 975 | 
             
                  forced_exit = catch(:IRB_EXIT) do
         | 
| 975 | 
            -
                    if  | 
| 976 | 
            +
                    if History.save_history? && context.io.support_history_saving?
         | 
| 976 977 | 
             
                      # Previous IRB session's history has been saved when `Irb#run` is exited We need
         | 
| 977 978 | 
             
                      # to make sure the saved history is not saved again by resetting the counter
         | 
| 978 979 | 
             
                      context.io.reset_history_counter
         | 
| @@ -1003,9 +1004,10 @@ module IRB | |
| 1003 1004 | 
             
                  prev_context = conf[:MAIN_CONTEXT]
         | 
| 1004 1005 | 
             
                  conf[:MAIN_CONTEXT] = context
         | 
| 1005 1006 |  | 
| 1006 | 
            -
                   | 
| 1007 | 
            +
                  load_history = !in_nested_session && context.io.support_history_saving?
         | 
| 1008 | 
            +
                  save_history = load_history && History.save_history?
         | 
| 1007 1009 |  | 
| 1008 | 
            -
                  if  | 
| 1010 | 
            +
                  if load_history
         | 
| 1009 1011 | 
             
                    context.io.load_history
         | 
| 1010 1012 | 
             
                  end
         | 
| 1011 1013 |  | 
| @@ -1130,7 +1132,7 @@ module IRB | |
| 1130 1132 | 
             
                    return Statement::EmptyInput.new
         | 
| 1131 1133 | 
             
                  end
         | 
| 1132 1134 |  | 
| 1133 | 
            -
                  code.force_encoding(@context.io.encoding)
         | 
| 1135 | 
            +
                  code = code.dup.force_encoding(@context.io.encoding)
         | 
| 1134 1136 | 
             
                  if (command, arg = @context.parse_command(code))
         | 
| 1135 1137 | 
             
                    command_class = Command.load_command(command)
         | 
| 1136 1138 | 
             
                    Statement::Command.new(code, command_class, arg)
         | 
| @@ -1467,10 +1469,10 @@ module IRB | |
| 1467 1469 | 
             
                    when "N"
         | 
| 1468 1470 | 
             
                      @context.irb_name
         | 
| 1469 1471 | 
             
                    when "m"
         | 
| 1470 | 
            -
                      main_str = @context. | 
| 1472 | 
            +
                      main_str = @context.safe_method_call_on_main(:to_s) rescue "!#{$!.class}"
         | 
| 1471 1473 | 
             
                      truncate_prompt_main(main_str)
         | 
| 1472 1474 | 
             
                    when "M"
         | 
| 1473 | 
            -
                      main_str = @context. | 
| 1475 | 
            +
                      main_str = @context.safe_method_call_on_main(:inspect) rescue "!#{$!.class}"
         | 
| 1474 1476 | 
             
                      truncate_prompt_main(main_str)
         | 
| 1475 1477 | 
             
                    when "l"
         | 
| 1476 1478 | 
             
                      ltype
         | 
    
        data/man/irb.1
    CHANGED
    
    | @@ -180,7 +180,7 @@ The default value is 16. | |
| 180 180 | 
             
            .El
         | 
| 181 181 | 
             
            .Pp
         | 
| 182 182 | 
             
            .Sh ENVIRONMENT
         | 
| 183 | 
            -
            .Bl -tag -compact -width " | 
| 183 | 
            +
            .Bl -tag -compact -width "IRB_USE_AUTOCOMPLETE"
         | 
| 184 184 | 
             
            .It Ev IRB_LANG
         | 
| 185 185 | 
             
            The locale used for
         | 
| 186 186 | 
             
            .Nm .
         | 
| @@ -190,10 +190,43 @@ The path to the personal initialization file. | |
| 190 190 | 
             
            .Pp
         | 
| 191 191 | 
             
            .It Ev XDG_CONFIG_HOME
         | 
| 192 192 | 
             
            .Nm
         | 
| 193 | 
            -
            respects XDG_CONFIG_HOME. If  | 
| 193 | 
            +
            respects XDG_CONFIG_HOME. If it is set and
         | 
| 194 | 
            +
            .Ev IRBRC
         | 
| 195 | 
            +
            is unset, load
         | 
| 194 196 | 
             
            .Pa $XDG_CONFIG_HOME/irb/irbrc
         | 
| 195 197 | 
             
            as a personal initialization file.
         | 
| 196 198 | 
             
            .Pp
         | 
| 199 | 
            +
            .It Ev RI_PAGER
         | 
| 200 | 
            +
            The command specified would be used as a pager.
         | 
| 201 | 
            +
            .Pp
         | 
| 202 | 
            +
            .It Ev PAGER
         | 
| 203 | 
            +
            The command specified would be used as a pager if
         | 
| 204 | 
            +
            .Ev RI_PAGER
         | 
| 205 | 
            +
            is unset.
         | 
| 206 | 
            +
            .Pp
         | 
| 207 | 
            +
            .It Ev VISUAL
         | 
| 208 | 
            +
            Its value would be used to open files by the edit command.
         | 
| 209 | 
            +
            .Pp
         | 
| 210 | 
            +
            .It Ev EDITOR
         | 
| 211 | 
            +
            Its value would be used to open files by the edit command if
         | 
| 212 | 
            +
            .Ev VISUAL
         | 
| 213 | 
            +
            is unset.
         | 
| 214 | 
            +
            .Pp
         | 
| 215 | 
            +
            .It Ev NO_COLOR
         | 
| 216 | 
            +
            Assigning a value to it disables colorization.
         | 
| 217 | 
            +
            .Pp
         | 
| 218 | 
            +
            .It Ev IRB_USE_AUTOCOMPLETE
         | 
| 219 | 
            +
            Assigning
         | 
| 220 | 
            +
            .Sy false
         | 
| 221 | 
            +
            to it disables autocompletion.
         | 
| 222 | 
            +
            .Pp
         | 
| 223 | 
            +
            .It Ev IRB_COMPLETOR
         | 
| 224 | 
            +
            Autocompletion behavior. Allowed values are
         | 
| 225 | 
            +
            .Sy regexp
         | 
| 226 | 
            +
            or
         | 
| 227 | 
            +
            .Sy type
         | 
| 228 | 
            +
            .
         | 
| 229 | 
            +
            .Pp
         | 
| 197 230 | 
             
            .El
         | 
| 198 231 | 
             
            .Pp
         | 
| 199 232 | 
             
            Also
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: irb
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.14. | 
| 4 | 
            +
              version: 1.14.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - aycabta
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire:
         | 
| 10 10 | 
             
            bindir: exe
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2024- | 
| 12 | 
            +
            date: 2024-12-18 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: reline
         |