類別 IRB::Context

包裝 irb 會話目前狀態的類別,包括 IRB.conf 的組態。

常數

KEYWORD_ALIASES

因為所有輸入最終都會評估為 Ruby 程式碼,與 Ruby 關鍵字衝突的指令名稱需要特別的解決方法,一旦我們為 IRB 實作更好的指令系統,我們就可以移除它們

屬性

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 的 backtrace 行數限制。

預設值為 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]

是否忽略 ^Dcontrol-d)。

如果設為 false^D 將會結束 irb。

ignore_eof?[RW]

是否忽略 ^Dcontrol-d)。

如果設為 false^D 將會結束 irb。

ignore_sigint[RW]

是否忽略 ^Ccontrol-c)。

如果設為 false^C 將會結束 irb。

如果設為 true

  • 在輸入期間:取消輸入然後回到頂層。

  • 在執行期間:放棄目前的執行。

ignore_sigint?[RW]

是否忽略 ^Ccontrol-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[RW]

可以是括號包圍的 irb_name,或是傳遞給 Context.newinput_method

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= 設定,使用傳遞給設定目前的 prompt_modemode:RETURN

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] 的副本

use_tracer[R]

在這個內容中評估陳述時是否使用 Tracer。

更多資訊請參閱 lib/tracer.rb

use_tracer?[R]

在這個內容中評估陳述時是否使用 Tracer。

更多資訊請參閱 lib/tracer.rb

verbose[RW]

是否顯示詳細訊息。

預設 IRB.conf[:VERBOSE] 的副本

with_debugger[RW]
workspace[RW]

目前內容中的 WorkSpace

workspace_home[R]

頂層工作區,請參閱 home_workspace

公開類別方法

new(irb, workspace = nil, input_method = nil) 按一下切換來源

建立新的 IRB 內容。

選用的 input_method 參數

nil

使用 stdin 或 RelineReadline

字串

使用 File

其他

將此用作 InputMethod

# File lib/irb/context.rb, line 23
    def initialize(irb, workspace = nil, input_method = nil)
      @irb = irb
      if workspace
        @workspace = workspace
      else
        @workspace = 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] if 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]

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

      case input_method
      when nil
        @io = nil
        case use_multiline?
        when nil
          if STDIN.tty? && 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) && STDIN.tty? &&
                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 = '-'
        @irb_path = '-'
      when String
        @io = FileInputMethod.new(input_method)
        @irb_name = File.basename(input_method)
        @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

      @user_aliases = IRB.conf[:COMMAND_ALIASES].dup
      @command_aliases = @user_aliases.merge(KEYWORD_ALIASES)
    end

公開執行個體方法

__exit__(ret = 0)
別名:exit
_set_last_value(value)

請參閱 set_last_value

別名:set_last_value
change_workspace(*_main) 按一下切換來源

將目前的 Workspace 變更為指定的物件或繫結。

如果省略選用參數,Workspace 將會是 home_workspace,它繼承自 TOPLEVEL_BINDING 或主物件,當 IRB 初始化時為 IRB.conf[:MAIN_CONTEXT]

更多資訊請參閱 IRB::WorkSpace.new

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

  @workspace = WorkSpace.new(_main[0])

  if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
    main.extend ExtendCommandBundle
  end
end
eval_history=(no) 按一下以切換來源

設定指令結果歷程記錄限制。預設值從 IRB.conf[:EVAL_HISTORY] 設定。

noIntegernil

如果大於 0,傳回 no 個歷程記錄項目。

如果 no 為 0,歷程記錄項目的數量不受限制。

如果 nonil,不使用執行結果歷程記錄(預設)。

EvalHistory 值可透過 __ 變數取得,請參閱 IRB::EvalHistory

# File lib/irb/ext/eval_history.rb, line 45
def eval_history=(no)
  if no
    if defined?(@eval_history) && @eval_history
      @eval_history_values.size(no)
    else
      @eval_history_values = EvalHistory.new(no)
      IRB.conf[:__TMP__EHV__] = @eval_history_values
      @workspace.evaluate("__ = IRB.conf[:__TMP__EHV__]")
      IRB.conf.delete(:__TMP_EHV__)
    end
  else
    @eval_history_values = nil
  end
  @eval_history = no
end
exit(ret = 0) 按一下以切換來源

結束目前的階段,請參閱 IRB.irb_exit

呼叫超類別方法 Kernel#exit
# File lib/irb/context.rb, line 578
def exit(ret = 0)
  IRB.irb_exit(@irb, ret)
rescue UncaughtThrowError
  super
end
別名為:__exit__
file_input?() 按一下以切換來源

在建立目前的內容時,io 是否使用 File 作為傳遞的 input_method,請參閱 ::new

# File lib/irb/context.rb, line 487
def file_input?
  @io.class == FileInputMethod
end
history_file() 按一下以切換來源

預設 IRB.conf[:HISTORY_FILE] 的副本

# File lib/irb/context.rb, line 206
def history_file
  IRB.conf[:HISTORY_FILE]
end
history_file=(hist) 按一下以切換來源

Set IRB.conf[:HISTORY_FILE] 至指定的 hist

# File lib/irb/context.rb, line 211
def history_file=(hist)
  IRB.conf[:HISTORY_FILE] = hist
end
home_workspace() 按一下以切換來源

繼承自 TOPLEVEL_BINDING

# File lib/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 lib/irb/context.rb, line 481
def inspect?
  @inspect_mode.nil? or @inspect_mode
end
inspect_mode=(opt) 按一下以切換來源

使用 opt 指定檢查模式

true

顯示 inspect

false

顯示 to_s

nil

非數學模式中的檢查模式,數學模式中的非檢查模式

請參閱 IRB::Inspector 以取得更多資訊。

也可以使用 --inspect--noinspect 命令列選項設定。

# File lib/irb/context.rb, line 502
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_level() 按一下以切換來源

目前 WorkSpace 堆疊的大小

# File lib/irb/ext/workspaces.rb, line 11
def irb_level
  workspace_stack.size
end
main() 按一下以切換來源

頂層工作空間,請參閱 WorkSpace#main

# File lib/irb/context.rb, line 216
def main
  @workspace.main
end
pop_workspace() 按一下以切換來源

移除目前 workspaces 堆疊中的最後一個元素並傳回,如果目前的 workspace 堆疊為空,則傳回 nil

另請參閱 push_workspace

# File lib/irb/ext/workspaces.rb, line 52
def pop_workspace
  if workspaces.empty?
    print "workspace stack empty\n"
    return
  end
  @workspace = workspaces.pop
end
prompt_mode=(mode) 按一下以切換來源

設定這個情境中提示的 mode

更多資訊請參閱 自訂提示

# File lib/irb/context.rb, line 465
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 lib/irb/context.rb, line 279
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 lib/irb/context.rb, line 285
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 lib/irb/context.rb, line 446
def prompting?
  verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
               @io.kind_of?(RelineInputMethod) ||
               (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
end
push_workspace(*_main) 按一下以切換來源

使用指定的物件或繫結建立新的 workspace,並將其附加到目前的 workspaces 堆疊。

請參閱 IRB::Context#change_workspaceIRB::WorkSpace.new 以取得更多資訊。

# File lib/irb/ext/workspaces.rb, line 29
def push_workspace(*_main)
  if _main.empty?
    if workspaces.empty?
      print "No other workspace\n"
      return nil
    end
    ws = workspaces.pop
    workspaces.push @workspace
    @workspace = ws
    return workspaces
  end

  workspaces.push @workspace
  @workspace = WorkSpace.new(@workspace.binding, _main[0])
  if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
    main.extend ExtendCommandBundle
  end
end
save_history() 按一下以切換來源
# File lib/irb/context.rb, line 201
def save_history
  IRB.conf[:SAVE_HISTORY]
end
save_history=(val) 按一下以切換來源
# File lib/irb/context.rb, line 197
def save_history=(val)
  IRB.conf[:SAVE_HISTORY] = val
end
set_last_value(value) 按一下以切換來源

將這個情境中最後評估的陳述式傳回值設定為 last_value

# File lib/irb/context.rb, line 457
def set_last_value(value)
  @last_value = value
  @workspace.local_variable_set :_, value
end
別名為: _set_last_value
symbol_alias?(command) 按一下以切換來源

如果從引數別名,且不是識別碼,則傳回 true。

# File lib/irb/context.rb, line 616
def symbol_alias?(command)
  return nil if command.match?(/\A\w+\z/)
  command_aliases.key?(command.to_sym)
end
transform_args?(command) 按一下以切換來源

如果指令支援轉換引數,則傳回 true

# File lib/irb/context.rb, line 622
def transform_args?(command)
  command = command_aliases.fetch(command.to_sym, command)
  ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args)
end
use_loader() 按一下以切換來源

傳回 load/require 是否使用 irb 本身的檔案讀取器方法。

此模式會受到全域影響(整個 irb)。

# File lib/irb/ext/use-loader.rb, line 37
def use_loader
  IRB.conf[:USE_LOADER]
end
別名為:use_loader?
use_loader=(opt) 按一下以切換來源

設定 IRB.conf[:USE_LOADER]

請參閱 use_loader 以取得更多資訊。

# File lib/irb/ext/use-loader.rb, line 47
def use_loader=(opt)

  if IRB.conf[:USE_LOADER] != opt
    IRB.conf[:USE_LOADER] = opt
    if opt
      if !$".include?("irb/cmd/load")
      end
      (class<<@workspace.main;self;end).instance_eval {
        alias_method :load, :irb_load
        alias_method :require, :irb_require
      }
    else
      (class<<@workspace.main;self;end).instance_eval {
        alias_method :load, :__original__load__IRB_use_loader__
        alias_method :require, :__original__require__IRB_use_loader__
      }
    end
  end
  print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
  opt
end
use_loader?()
別名為:use_loader
use_tracer=(opt) 按一下以切換來源
# File lib/irb/ext/tracer.rb, line 13
def use_tracer=(opt)
  # do nothing
end
verbose?() 按一下以切換來源

傳回是否顯示訊息。

# File lib/irb/context.rb, line 427
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
workspaces() 按一下以切換來源

目前堆疊中的工作空間

# File lib/irb/ext/workspaces.rb, line 16
def workspaces
  if defined? @workspaces
    @workspaces
  else
    @workspaces = []
  end
end

私人實例方法

build_completor() 按一下以切換來源
# File lib/irb/context.rb, line 164
        def build_completor
  completor_type = IRB.conf[:COMPLETOR]
  case completor_type
  when :regexp
    return RegexpCompletor.new
  when :type
    completor = build_type_completor
    return completor if completor
  else
    warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}"
  end
  # Fallback to RegexpCompletor
  RegexpCompletor.new
end
build_type_completor() 按一下以切換來源
# File lib/irb/context.rb, line 179
        def build_type_completor
  if RUBY_ENGINE == 'truffleruby'
    # Avoid SynatxError. truffleruby does not support endless method definition yet.
    warn 'TypeCompletor is not supported on TruffleRuby yet'
    return
  end

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

  ReplTypeCompletor.preload_rbs
  TypeCompletor.new(self)
end