class IRB::Context
一个封装 irb 会话当前状态的类,包括 IRB.conf 的配置。
常量
- ASSIGN_OPERATORS_REGEXP
- KERNEL_METHOD
- KERNEL_PUBLIC_METHOD
属性
默认 IRB.conf[:AP_NAME]
的副本
可以是默认的 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
中的配置。
显示为顶部 n
行和尾部 n
行的回溯行数限制。
默认值为 16。
也可以使用 --back-trace-limit
命令行选项进行设置。
用户定义的 IRB
命令别名
是否将返回值回显到输出。
如果可用,则使用 IRB.conf[:ECHO]
,否则默认为 true
。
puts "hello" # hello #=> nil IRB.CurrentContext.echo = false puts "omg" # omg
是否将返回值回显到输出。
如果可用,则使用 IRB.conf[:ECHO]
,否则默认为 true
。
puts "hello" # hello #=> nil IRB.CurrentContext.echo = false puts "omg" # omg
是否回显赋值表达式。
如果设置为 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
是否回显赋值表达式。
如果设置为 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=
并使用非 nil 值(直接或通过在 .irbrc
中设置 IRB.conf[:EVAL_HISTORY]
)之前,此方法不可用。
指定要在文档对话框中显示的 ri 文件的安装位置。
是否忽略 ^D
(control-d
)。
如果设置为 false
,则 ^D
将退出 irb。
是否忽略 ^D
(control-d
)。
如果设置为 false
,则 ^D
将退出 irb。
是否忽略 ^C
(control-c
)。
如果设置为 false
,则 ^C
将退出 irb。
如果设置为 true
,
-
在输入期间:取消输入,然后返回到顶层。
-
在执行期间:放弃当前执行。
是否忽略 ^C
(control-c
)。
如果设置为 false
,则 ^C
将退出 irb。
如果设置为 true
,
-
在输入期间:取消输入,然后返回到顶层。
-
在执行期间:放弃当前执行。
默认 IRB.conf[:INSPECT_MODE]
的副本
当前输入方法。
可以是 StdioInputMethod
、ReadlineInputMethod
、RelineInputMethod
、FileInputMethod
或在创建上下文时指定的其他方法。有关 input_method
的更多信息,请参阅 ::new
。
当前 irb 会话。
可以是来自 IRB.conf[:IRB_NAME]
的名称,或者是 JobManager 设置的当前作业的编号,例如 irb#2
可以是以下之一
-
用括号括起来的
irb_name
-
传递给
Context.new
的input_method
-
绑定中的当前
IRB
上下文的文件路径。irb 会话
上次求值语句的返回值。
默认 IRB.conf[:LOAD_MODULES]
的副本
是否在多行输出之前放置换行符。
如果可用,则使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
,否则默认为 true
。
"abc\ndef" #=> abc def IRB.CurrentContext.newline_before_multiline_output = false "abc\ndef" #=> abc def
是否在多行输出之前放置换行符。
如果可用,则使用 IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
,否则默认为 true
。
"abc\ndef" #=> abc def IRB.CurrentContext.newline_before_multiline_output = false "abc\ndef" #=> abc def
默认 IRB.conf[:PROMPT_MODE]
的副本
默认 IRB.conf[:RC]
的副本
默认 IRB.conf[:RC]
的副本
由 prompt_mode=
设置的返回语句格式,使用传递给 mode
的 :RETURN
来设置当前的 prompt_mode
。
此上下文中的当前线程。
是否启用颜色化。
默认 IRB.conf[:USE_AUTOCOMPLETE]
的副本
是否启用颜色化。
默认 IRB.conf[:USE_AUTOCOMPLETE]
的副本
是否启用多行编辑器模式。
默认 IRB.conf[:USE_MULTILINE]
的副本
是否启用多行编辑器模式。
默认 IRB.conf[:USE_MULTILINE]
的副本
是否启用单行编辑器模式。
默认 IRB.conf[:USE_SINGLELINE]
的副本
是否启用单行编辑器模式。
默认 IRB.conf[:USE_SINGLELINE]
的副本
是否启用多行编辑器模式。
默认 IRB.conf[:USE_MULTILINE]
的副本
是否启用多行编辑器模式。
默认 IRB.conf[:USE_MULTILINE]
的副本
是否启用单行编辑器模式。
默认 IRB.conf[:USE_SINGLELINE]
的副本
是否启用单行编辑器模式。
默认 IRB.conf[:USE_SINGLELINE]
的副本
是否显示详细消息。
默认 IRB.conf[:VERBOSE]
的副本
顶层工作区,请参阅 home_workspace
公共类方法
创建新的 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
公共实例方法
将当前工作区更改为给定的对象或绑定。
如果省略可选参数,则工作区将为 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
# 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
# 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 irb/context.rb, line 608 def from_binding? @irb.from_binding end
默认 IRB.conf[:HISTORY_FILE]
的副本
# File irb/context.rb, line 228 def history_file IRB.conf[:HISTORY_FILE] end
将 IRB.conf[:HISTORY_FILE]
设置为给定的 hist
。
# File irb/context.rb, line 233 def history_file=(hist) IRB.conf[:HISTORY_FILE] = hist end
继承自 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_mode
,请参阅 inspect_mode=
以获取更多详细信息。
# File irb/context.rb, line 528 def inspect? @inspect_mode.nil? or @inspect_mode end
使用 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
,以及 @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
顶层工作空间,请参阅 WorkSpace#main
# File irb/context.rb, line 249 def main workspace.main end
# 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
从当前工作空间堆栈中删除最后一个元素并返回它,如果当前工作空间堆栈为空,则返回 nil
。
另请参阅 push_workspace
。
# File irb/ext/workspaces.rb, line 32 def pop_workspace @workspace_stack.pop if @workspace_stack.size > 1 end
在此上下文中设置提示的 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
待办事项:在开发 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
待办事项:在开发 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
是否 verbose?
为 true
,并且 input_method
是 StdioInputMethod
、RelineInputMethod
或 ReadlineInputMethod
之一,有关更多信息,请参阅 io
。
# File irb/context.rb, line 495 def prompting? verbose? || @io.prompting? end
使用给定对象或绑定创建一个新的工作空间,并将其附加到当前工作空间堆栈。
有关更多信息,请参阅 IRB::Context#change_workspace
和 IRB::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
使用给定的 workspace
替换当前工作空间。
# File irb/context.rb, line 243 def replace_workspace(workspace) @workspace_stack.pop @workspace_stack.push(workspace) end
# 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
# File irb/context.rb, line 223 def save_history IRB.conf[:SAVE_HISTORY] end
# File irb/context.rb, line 219 def save_history=(val) IRB.conf[:SAVE_HISTORY] = val end
将此上下文中评估的最后一条语句的返回值设置为 last_value
。
# File irb/context.rb, line 504 def set_last_value(value) @last_value = value workspace.local_variable_set :_, value end
返回 irb
自己的文件读取器方法是否被 load
/require
使用。
此模式是全局影响的(在整个 irb 中)。
# File irb/ext/use-loader.rb, line 37 def use_loader IRB.conf[:USE_LOADER] end
# File irb/context.rb, line 174 def use_loader=(val) self.class.remove_method(__method__) require_relative "ext/use-loader" __send__(__method__, val) end
# File irb/context.rb, line 163 def use_tracer=(val) require_relative "ext/tracer" if val IRB.conf[:USE_TRACER] = val end
返回是否显示消息。
# 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
当前上下文中的工作空间。
# File irb/context.rb, line 238 def workspace @workspace_stack.last end
私有实例方法
# 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
# 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
# File irb/context.rb, line 158 def term_interactive? return true if ENV['TEST_IRB_FORCE_INTERACTIVE'] STDIN.tty? && ENV['TERM'] != 'dumb' end