【发布时间】:2017-01-22 19:05:29
【问题描述】:
我想通过应用一些 IRB 配置选项来扩展默认的控制台应用程序,该应用程序是使用 bundle gem 作为标准构建的。
Looking at the documentation,我可以看到例如应该可以更改提示,这在交互式会话中可以正常工作。例如,我可以像这样使用显示的提示:
2.1.4 :001 > conf.prompt_mode=:SIMPLE
=> :SIMPLE
>>
?> conf.prompt_mode=:DEFAULT
=> :DEFAULT
irb(main):004:0>
但是,我找不到如何将其转换为在控制台应用程序中使用的语法。例如这个脚本:
require 'irb'
IRB.conf[:PROMPT_MODE] = :SIMPLE
IRB.start
从通用的配置提示开始:
2.1.4 :001 >
我花了一些时间试图找到一个在不加载全局默认值的情况下将 IRB 用于自定义 repl 的示例,但没有找到任何可以复制的内容。
我可以看到未记录的方法IRB.setup 与此有关,它以某种方式设置所有配置。我唯一的选择是编写自己的IRB.start 版本,在调用IRB.setup 后应用我想要的配置,还是支持我想做的内置但未在标准位置记录的功能?
例如以下工作,但我觉得以这种方式扩展 IRB 模块有点笨拙(如果 IRB 内部发生变化,也容易失败)。
require 'irb'
def IRB.custom_start custom_conf = {}
STDOUT.sync = true
IRB.setup(nil)
custom_conf.each do |k,v|
IRB.conf[k] = v
end
if @CONF[:SCRIPT]
irb = IRB::Irb.new(nil, @CONF[:SCRIPT])
else
irb = IRB::Irb.new
end
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
@CONF[:MAIN_CONTEXT] = irb.context
trap("SIGINT") do
irb.signal_handle
end
begin
catch(:IRB_EXIT) do
irb.eval_input
end
ensure
irb_at_exit
end
end
IRB.custom_start :PROMPT_MODE => :SIMPLE
【问题讨论】: