class IRB::Context

一个封装 irb 会话当前状态的类,包括 IRB.conf 的配置。

常量

ASSIGN_OPERATORS_REGEXP
KERNEL_METHOD
KERNEL_PUBLIC_METHOD

属性

ap_name[RW]

默认 IRB.conf[:AP_NAME] 的副本

auto_indent_mode[RW]

可以是默认的 IRB.conf[:AUTO_INDENT],或由 prompt_mode= 设置的模式

要在 irb 中禁用自动缩进

IRB.conf[:AUTO_INDENT] = false

irb_context.auto_indent_mode = false

IRB.CurrentContext.auto_indent_mode = false

有关更多信息,请参阅 IRB 中的配置

back_trace_limit[RW]

显示为顶部 n 行和尾部 n 行的回溯行数限制。

默认值为 16。

也可以使用 --back-trace-limit 命令行选项进行设置。

command_aliases[RW]

用户定义的 IRB 命令别名

echo[RW]

是否将返回值回显到输出。

如果可用,则使用 IRB.conf[:ECHO],否则默认为 true

puts "hello"
# hello
#=> nil
IRB.CurrentContext.echo = false
puts "omg"
# omg
echo?[RW]

是否将返回值回显到输出。

如果可用,则使用 IRB.conf[:ECHO],否则默认为 true

puts "hello"
# hello
#=> nil
IRB.CurrentContext.echo = false
puts "omg"
# omg
echo_on_assignment[RW]

是否回显赋值表达式。

如果设置为 false,则不会显示赋值的值。

如果设置为 true,则会显示赋值的值。

如果设置为 :truncate,则会显示并截断赋值的值。

默认为 :truncate

a = "omg"
#=> omg

a = "omg" * 10
#=> omgomgomgomgomgomgomg...

IRB.CurrentContext.echo_on_assignment = false
a = "omg"

IRB.CurrentContext.echo_on_assignment = true
a = "omg" * 10
#=> omgomgomgomgomgomgomgomgomgomg

要设置 irb 中赋值的显示行为

IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

irb_context.echo_on_assignment = :truncate or true or false

IRB.CurrentContext.echo_on_assignment = :truncate or true or false
echo_on_assignment?[RW]

是否回显赋值表达式。

如果设置为 false,则不会显示赋值的值。

如果设置为 true,则会显示赋值的值。

如果设置为 :truncate,则会显示并截断赋值的值。

默认为 :truncate

a = "omg"
#=> omg

a = "omg" * 10
#=> omgomgomgomgomgomgomg...

IRB.CurrentContext.echo_on_assignment = false
a = "omg"

IRB.CurrentContext.echo_on_assignment = true
a = "omg" * 10
#=> omgomgomgomgomgomgomgomgomgomg

要设置 irb 中赋值的显示行为

IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

irb_context.echo_on_assignment = :truncate or true or false

IRB.CurrentContext.echo_on_assignment = :truncate or true or false
eval_history[R]

命令结果历史限制。在调用 eval_history= 并使用非 nil 值(直接或通过在 .irbrc 中设置 IRB.conf[:EVAL_HISTORY])之前,此方法不可用。

extra_doc_dirs[RW]

指定要在文档对话框中显示的 ri 文件的安装位置。

ignore_eof[RW]

是否忽略 ^D (control-d)。

如果设置为 false,则 ^D 将退出 irb。

ignore_eof?[RW]

是否忽略 ^D (control-d)。

如果设置为 false,则 ^D 将退出 irb。

ignore_sigint[RW]

是否忽略 ^C (control-c)。

如果设置为 false,则 ^C 将退出 irb。

如果设置为 true

  • 在输入期间:取消输入,然后返回到顶层。

  • 在执行期间:放弃当前执行。

ignore_sigint?[RW]

是否忽略 ^C (control-c)。

如果设置为 false,则 ^C 将退出 irb。

如果设置为 true

  • 在输入期间:取消输入,然后返回到顶层。

  • 在执行期间:放弃当前执行。

inspect_mode[R]

默认 IRB.conf[:INSPECT_MODE] 的副本

io[RW]

当前输入方法。

可以是 StdioInputMethodReadlineInputMethodRelineInputMethodFileInputMethod 或在创建上下文时指定的其他方法。有关 input_method 的更多信息,请参阅 ::new

irb[RW]

当前 irb 会话。

irb_name[RW]

可以是来自 IRB.conf[:IRB_NAME] 的名称,或者是 JobManager 设置的当前作业的编号,例如 irb#2

irb_path[R]

可以是以下之一

  • 用括号括起来的 irb_name

  • 传递给 Context.newinput_method

  • 绑定中的当前 IRB 上下文的文件路径。irb 会话

last_value[R]

上次求值语句的返回值。

load_modules[RW]

默认 IRB.conf[:LOAD_MODULES] 的副本

newline_before_multiline_output[RW]

是否在多行输出之前放置换行符。

如果可用,则使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT],否则默认为 true

"abc\ndef"
#=>
abc
def
IRB.CurrentContext.newline_before_multiline_output = false
"abc\ndef"
#=> abc
def
newline_before_multiline_output?[RW]

是否在多行输出之前放置换行符。

如果可用,则使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT],否则默认为 true

"abc\ndef"
#=>
abc
def
IRB.CurrentContext.newline_before_multiline_output = false
"abc\ndef"
#=> abc
def
prompt_c[RW]

用于连续语句的 IRB 提示符。(例如,紧接在 if 之后)

有关更多信息,请参阅 自定义提示

prompt_i[RW]

标准 IRB 提示符。

有关更多信息,请参阅 自定义提示

prompt_mode[R]

默认 IRB.conf[:PROMPT_MODE] 的副本

prompt_s[RW]

用于连续字符串的 IRB 提示符。

有关更多信息,请参阅 自定义提示

rc[RW]

默认 IRB.conf[:RC] 的副本

rc?[RW]

默认 IRB.conf[:RC] 的副本

return_format[RW]

prompt_mode= 设置的返回语句格式,使用传递给 mode:RETURN 来设置当前的 prompt_mode

thread[R]

此上下文中的当前线程。

use_autocomplete[R]

是否启用颜色化。

默认 IRB.conf[:USE_AUTOCOMPLETE] 的副本

use_autocomplete?[R]

是否启用颜色化。

默认 IRB.conf[:USE_AUTOCOMPLETE] 的副本

use_multiline[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本

use_multiline?[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本

use_readline[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本

use_readline?[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本

use_reline[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本

use_reline?[R]

是否启用多行编辑器模式。

默认 IRB.conf[:USE_MULTILINE] 的副本

use_singleline[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本

use_singleline?[R]

是否启用单行编辑器模式。

默认 IRB.conf[:USE_SINGLELINE] 的副本

verbose[RW]

是否显示详细消息。

默认 IRB.conf[:VERBOSE] 的副本

with_debugger[RW]
workspace_home[R]

顶层工作区,请参阅 home_workspace

公共类方法

new(irb, workspace = nil, input_method = nil) 点击以切换源

创建新的 IRB 上下文。

可选的 input_method 参数

nil

使用 stdin 或 Reline 或 Readline

String

使用文件

其他

将其用作 InputMethod

# File irb/context.rb, line 27
    def initialize(irb, workspace = nil, input_method = nil)
      @irb = irb
      @workspace_stack = []
      if workspace
        @workspace_stack << workspace
      else
        @workspace_stack << WorkSpace.new
      end
      @thread = Thread.current

      # copy of default configuration
      @ap_name = IRB.conf[:AP_NAME]
      @rc = IRB.conf[:RC]
      @load_modules = IRB.conf[:LOAD_MODULES]

      if IRB.conf.has_key?(:USE_SINGLELINE)
        @use_singleline = IRB.conf[:USE_SINGLELINE]
      elsif IRB.conf.has_key?(:USE_READLINE) # backward compatibility
        @use_singleline = IRB.conf[:USE_READLINE]
      else
        @use_singleline = nil
      end
      if IRB.conf.has_key?(:USE_MULTILINE)
        @use_multiline = IRB.conf[:USE_MULTILINE]
      elsif IRB.conf.has_key?(:USE_RELINE) # backward compatibility
        warn <<~MSG.strip
          USE_RELINE is deprecated, please use USE_MULTILINE instead.
        MSG
        @use_multiline = IRB.conf[:USE_RELINE]
      elsif IRB.conf.has_key?(:USE_REIDLINE)
        warn <<~MSG.strip
          USE_REIDLINE is deprecated, please use USE_MULTILINE instead.
        MSG
        @use_multiline = IRB.conf[:USE_REIDLINE]
      else
        @use_multiline = nil
      end
      @use_autocomplete = IRB.conf[:USE_AUTOCOMPLETE]
      @verbose = IRB.conf[:VERBOSE]
      @io = nil

      self.inspect_mode = IRB.conf[:INSPECT_MODE]
      self.use_tracer = IRB.conf[:USE_TRACER]
      self.use_loader = IRB.conf[:USE_LOADER] if IRB.conf[:USE_LOADER]
      self.eval_history = IRB.conf[:EVAL_HISTORY] if IRB.conf[:EVAL_HISTORY]

      @ignore_sigint = IRB.conf[:IGNORE_SIGINT]
      @ignore_eof = IRB.conf[:IGNORE_EOF]

      @back_trace_limit = IRB.conf[:BACK_TRACE_LIMIT]

      self.prompt_mode = IRB.conf[:PROMPT_MODE]

      @irb_name = IRB.conf[:IRB_NAME]

      unless IRB.conf[:SINGLE_IRB] or !defined?(IRB::JobManager)
        @irb_name = @irb_name + "#" + IRB.JobManager.n_jobs.to_s
      end

      self.irb_path = "(" + @irb_name + ")"

      case input_method
      when nil
        @io = nil
        case use_multiline?
        when nil
          if term_interactive? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
            # Both of multiline mode and singleline mode aren't specified.
            @io = RelineInputMethod.new(build_completor)
          else
            @io = nil
          end
        when false
          @io = nil
        when true
          @io = RelineInputMethod.new(build_completor)
        end
        unless @io
          case use_singleline?
          when nil
            if (defined?(ReadlineInputMethod) && term_interactive? &&
                IRB.conf[:PROMPT_MODE] != :INF_RUBY)
              @io = ReadlineInputMethod.new
            else
              @io = nil
            end
          when false
            @io = nil
          when true
            if defined?(ReadlineInputMethod)
              @io = ReadlineInputMethod.new
            else
              @io = nil
            end
          else
            @io = nil
          end
        end
        @io = StdioInputMethod.new unless @io

      when '-'
        @io = FileInputMethod.new($stdin)
        @irb_name = '-'
        self.irb_path = '-'
      when String
        @io = FileInputMethod.new(input_method)
        @irb_name = File.basename(input_method)
        self.irb_path = input_method
      else
        @io = input_method
      end
      @extra_doc_dirs = IRB.conf[:EXTRA_DOC_DIRS]

      @echo = IRB.conf[:ECHO]
      if @echo.nil?
        @echo = true
      end

      @echo_on_assignment = IRB.conf[:ECHO_ON_ASSIGNMENT]
      if @echo_on_assignment.nil?
        @echo_on_assignment = :truncate
      end

      @newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
      if @newline_before_multiline_output.nil?
        @newline_before_multiline_output = true
      end

      @command_aliases = IRB.conf[:COMMAND_ALIASES].dup
    end

公共实例方法

_set_last_value(value)

请参阅 set_last_value

change_workspace(*_main) 点击以切换源

将当前工作区更改为给定的对象或绑定。

如果省略可选参数,则工作区将为 home_workspace,它继承自 TOPLEVEL_BINDING 或主对象,即在 irb 初始化时设置的 IRB.conf[:MAIN_CONTEXT]

有关更多信息,请参阅 IRB::WorkSpace.new

# File irb/ext/change-ws.rb, line 26
def change_workspace(*_main)
  if _main.empty?
    replace_workspace(home_workspace)
    return main
  end

  workspace = WorkSpace.new(_main[0])
  replace_workspace(workspace)
  workspace.load_helper_methods_to_main
end
colorize_input(input, complete:) 点击以切换源
# File irb/context.rb, line 661
def colorize_input(input, complete:)
  if IRB.conf[:USE_COLORIZE] && IRB::Color.colorable?
    lvars = local_variables || []
    if parse_command(input)
      name, sep, arg = input.split(/(\s+)/, 2)
      arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars)
      "#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}"
    else
      IRB::Color.colorize_code(input, complete: complete, local_variables: lvars)
    end
  else
    Reline::Unicode.escape_for_print(input)
  end
end
eval_history=(val) 点击以切换源
# File irb/context.rb, line 168
def eval_history=(val)
  self.class.remove_method(__method__)
  require_relative "ext/eval_history"
  __send__(__method__, val)
end
file_input?() 点击以切换源

当创建当前上下文时,io 是否将文件用于传递的 input_method,请参阅 ::new

# File irb/context.rb, line 534
def file_input?
  @io.class == FileInputMethod
end
from_binding?() 点击以切换源
# File irb/context.rb, line 608
def from_binding?
  @irb.from_binding
end
history_file() 点击以切换源

默认 IRB.conf[:HISTORY_FILE] 的副本

# File irb/context.rb, line 228
def history_file
  IRB.conf[:HISTORY_FILE]
end
history_file=(hist) 点击以切换源

IRB.conf[:HISTORY_FILE] 设置为给定的 hist

# File irb/context.rb, line 233
def history_file=(hist)
  IRB.conf[:HISTORY_FILE] = hist
end
home_workspace() 点击以切换源

继承自 TOPLEVEL_BINDING

# File irb/ext/change-ws.rb, line 11
def home_workspace
  if defined? @home_workspace
    @home_workspace
  else
    @home_workspace = workspace
  end
end
inspect?() 点击以切换源

无论是否设置了 inspect_mode,请参阅 inspect_mode= 以获取更多详细信息。

# File irb/context.rb, line 528
def inspect?
  @inspect_mode.nil? or @inspect_mode
end
inspect_mode=(opt) 点击切换源代码

使用 opt 指定检查模式

true

显示 inspect

false

显示 to_s

nil

在非数学模式下使用检查模式,在数学模式下使用非检查模式

有关更多信息,请参阅 IRB::Inspector

也可以使用 --inspect--noinspect 命令行选项进行设置。

# File irb/context.rb, line 549
def inspect_mode=(opt)

  if i = Inspector::INSPECTORS[opt]
    @inspect_mode = opt
    @inspect_method = i
    i.init
  else
    case opt
    when nil
      if Inspector.keys_with_inspector(Inspector::INSPECTORS[true]).include?(@inspect_mode)
        self.inspect_mode = false
      elsif Inspector.keys_with_inspector(Inspector::INSPECTORS[false]).include?(@inspect_mode)
        self.inspect_mode = true
      else
        puts "Can't switch inspect mode."
        return
      end
    when /^\s*\{.*\}\s*$/
      begin
        inspector = eval "proc#{opt}"
      rescue Exception
        puts "Can't switch inspect mode(#{opt})."
        return
      end
      self.inspect_mode = inspector
    when Proc
      self.inspect_mode = IRB::Inspector(opt)
    when Inspector
      prefix = "usr%d"
      i = 1
      while Inspector::INSPECTORS[format(prefix, i)]; i += 1; end
      @inspect_mode = format(prefix, i)
      @inspect_method = opt
      Inspector.def_inspector(format(prefix, i), @inspect_method)
    else
      puts "Can't switch inspect mode(#{opt})."
      return
    end
  end
  print "Switch to#{unless @inspect_mode; ' non';end} inspect mode.\n" if verbose?
  @inspect_mode
end
irb_path=(path) 点击切换源代码

将 @irb_path 设置为给定的 path,以及 @eval_path。@eval_path 用于在 IRB 会话的上下文中评估代码。它与 irb_path 相同,但带有 IRB 名称后缀。这确保用户可以区分在 IRB 会话中定义的方法与在当前文件的上下文中定义的方法,特别是使用 binding.irb。

# File irb/context.rb, line 287
def irb_path=(path)
  @irb_path = path

  if File.exist?(path)
    @eval_path = "#{path}(#{IRB.conf[:IRB_NAME]})"
  else
    @eval_path = path
  end
end
main() 点击切换源代码

顶层工作空间,请参阅 WorkSpace#main

# File irb/context.rb, line 249
def main
  workspace.main
end
parse_command(code) 点击切换源代码
# File irb/context.rb, line 636
def parse_command(code)
  command_name, arg = code.strip.split(/\s+/, 2)
  return unless code.lines.size == 1 && command_name

  arg ||= ''
  command = command_name.to_sym
  # Command aliases are always command. example: $, @
  if (alias_name = command_aliases[command])
    return [alias_name, arg]
  end

  # Assignment-like expression is not a command
  return if arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)

  # Local variable have precedence over command
  return if local_variables.include?(command)

  # Check visibility
  public_method = !!KERNEL_PUBLIC_METHOD.bind_call(main, command) rescue false
  private_method = !public_method && !!KERNEL_METHOD.bind_call(main, command) rescue false
  if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
    [command, arg]
  end
end
pop_workspace() 点击切换源代码

从当前工作空间堆栈中删除最后一个元素并返回它,如果当前工作空间堆栈为空,则返回 nil

另请参阅 push_workspace

# File irb/ext/workspaces.rb, line 32
def pop_workspace
  @workspace_stack.pop if @workspace_stack.size > 1
end
prompt_mode=(mode) 点击切换源代码

在此上下文中设置提示的 mode

有关更多信息,请参阅 自定义提示

# File irb/context.rb, line 512
def prompt_mode=(mode)
  @prompt_mode = mode
  pconf = IRB.conf[:PROMPT][mode]
  @prompt_i = pconf[:PROMPT_I]
  @prompt_s = pconf[:PROMPT_S]
  @prompt_c = pconf[:PROMPT_C]
  @return_format = pconf[:RETURN]
  @return_format = "%s\n" if @return_format == nil
  if ai = pconf.include?(:AUTO_INDENT)
    @auto_indent_mode = ai
  else
    @auto_indent_mode = IRB.conf[:AUTO_INDENT]
  end
end
prompt_n() 点击切换源代码

待办事项:在开发 v2.0 时删除此项

# File irb/context.rb, line 328
def prompt_n
  warn "IRB::Context#prompt_n is deprecated and will be removed in the next major release."
  ""
end
prompt_n=(_) 点击切换源代码

待办事项:在开发 v2.0 时删除此项

# File irb/context.rb, line 334
def prompt_n=(_)
  warn "IRB::Context#prompt_n= is deprecated and will be removed in the next major release."
  ""
end
prompting?() 点击切换源代码

是否 verbose?true,并且 input_methodStdioInputMethodRelineInputMethodReadlineInputMethod 之一,有关更多信息,请参阅 io

# File irb/context.rb, line 495
def prompting?
  verbose? || @io.prompting?
end
push_workspace(*_main) 点击切换源代码

使用给定对象或绑定创建一个新的工作空间,并将其附加到当前工作空间堆栈。

有关更多信息,请参阅 IRB::Context#change_workspaceIRB::WorkSpace.new

# File irb/ext/workspaces.rb, line 14
def push_workspace(*_main)
  if _main.empty?
    if @workspace_stack.size > 1
      # swap the top two workspaces
      previous_workspace, current_workspace = @workspace_stack.pop(2)
      @workspace_stack.push current_workspace, previous_workspace
    end
  else
    new_workspace = WorkSpace.new(workspace.binding, _main[0])
    @workspace_stack.push new_workspace
    new_workspace.load_helper_methods_to_main
  end
end
replace_workspace(workspace) 点击切换源代码

使用给定的 workspace 替换当前工作空间。

# File irb/context.rb, line 243
def replace_workspace(workspace)
  @workspace_stack.pop
  @workspace_stack.push(workspace)
end
safe_method_call_on_main(method_name) 点击切换源代码
# File irb/context.rb, line 711
def safe_method_call_on_main(method_name)
  main_object = main
  Object === main_object ? main_object.__send__(method_name) : Object.instance_method(method_name).bind_call(main_object)
end
save_history() 点击切换源代码
# File irb/context.rb, line 223
def save_history
  IRB.conf[:SAVE_HISTORY]
end
save_history=(val) 点击切换源代码
# File irb/context.rb, line 219
def save_history=(val)
  IRB.conf[:SAVE_HISTORY] = val
end
set_last_value(value) 点击切换源代码

将此上下文中评估的最后一条语句的返回值设置为 last_value

# File irb/context.rb, line 504
def set_last_value(value)
  @last_value = value
  workspace.local_variable_set :_, value
end
别名也为:_set_last_value
use_loader() 点击切换源代码

返回 irb 自己的文件读取器方法是否被 load/require 使用。

此模式是全局影响的(在整个 irb 中)。

# File irb/ext/use-loader.rb, line 37
def use_loader
  IRB.conf[:USE_LOADER]
end
别名也为:use_loader?
use_loader=(val) 点击切换源代码
# File irb/context.rb, line 174
def use_loader=(val)
  self.class.remove_method(__method__)
  require_relative "ext/use-loader"
  __send__(__method__, val)
end
use_loader?()
别名为:use_loader
use_tracer=(val) 点击切换源代码
# File irb/context.rb, line 163
def use_tracer=(val)
  require_relative "ext/tracer" if val
  IRB.conf[:USE_TRACER] = val
end
verbose?() 点击切换源代码

返回是否显示消息。

# File irb/context.rb, line 476
def verbose?
  if @verbose.nil?
    if @io.kind_of?(RelineInputMethod)
      false
    elsif defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
      false
    elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
      true
    else
      false
    end
  else
    @verbose
  end
end
workspace() 点击切换源代码

当前上下文中的工作空间。

# File irb/context.rb, line 238
def workspace
  @workspace_stack.last
end

私有实例方法

build_completor() 点击切换源代码
# File irb/context.rb, line 180
        def build_completor
  completor_type = IRB.conf[:COMPLETOR]

  # Gem repl_type_completor is added to bundled gems in Ruby 3.4.
  # Use :type as default completor only in Ruby 3.4 or later.
  verbose = !!completor_type
  completor_type ||= RUBY_VERSION >= '3.4' ? :type : :regexp

  case completor_type
  when :regexp
    return RegexpCompletor.new
  when :type
    completor = build_type_completor(verbose: verbose)
    return completor if completor
  else
    warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}"
  end
  # Fallback to RegexpCompletor
  RegexpCompletor.new
end
build_type_completor(verbose:) 点击切换源代码
# File irb/context.rb, line 201
        def build_type_completor(verbose:)
  if RUBY_ENGINE == 'truffleruby'
    # Avoid SyntaxError. truffleruby does not support endless method definition yet.
    warn 'TypeCompletor is not supported on TruffleRuby yet' if verbose
    return
  end

  begin
    require 'repl_type_completor'
  rescue LoadError => e
    warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}" if verbose
    return
  end

  ReplTypeCompletor.preload_rbs
  TypeCompletor.new(self)
end
term_interactive?() 点击切换源代码
# File irb/context.rb, line 158
        def term_interactive?
  return true if ENV['TEST_IRB_FORCE_INTERACTIVE']
  STDIN.tty? && ENV['TERM'] != 'dumb'
end