我想通过应用一些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 >
我花了一些时间尝试在不加载全局默认值的情况下找到自定义repl的IRB示例,但找不到我可以复制的任何内容。
我可以看到未记录的方法IRB.setup
与此有关,它以某种方式设置所有配置。我是唯一一个选择在调用IRB.start
之后编写我自己的IRB.setup
版本来应用我想要的配置,还是支持我想要内置但未在标准位置记录的内容?
E.g。下面的工作,但我觉得这样做有点笨重地扩展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
答案 0 :(得分:2)
您可以通过两种方式应用自定义配置。
第一个是使用irbrc file。构建控制台应用程序(从ruby文件调用IRB.start
而不是从控制台调用irb
)可能很棘手。
第二个是你在帖子中描述的方法。您可以根据the original one编写自己的IRB::start
方法。与使用未记录的API存在完全相同的潜在问题 - 它可能会在未来使用更新版本的irb时中断。
您应该考虑是否真的需要在irb的顶部构建一个控制台应用程序。例如,您可以使用Pry
解决此问题。在开始交互式会话之前,它允许define configuration。
答案 1 :(得分:1)
require 'irb'
IRB.conf[:PROMPT_MODE] = :SIMPLE
IRB.start
上述方法无效,因为conf[:PROMPT_MODE]
在名为IRB.init_config
here
当IRB.start
被调用时,它会调用IRB.setup
,而IRB.init_config
会调用方法conf[:PROMPT_MODE]
- 这会超越require 'irb'
module IRB
singleton_class.send(:alias_method, :old_setup, :setup)
def IRB.setup(ap_path)
IRB.old_setup(ap_path)
conf[:PROMPT_MODE] = :SIMPLE
end
end
IRB.start
设置。
这是解决问题的一种方法(依赖于实施的内部知识)。
lMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")
Dim result As Long = SendMessageTimeout(htmlWindow, lMsg, 0, 0, SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, lRes)