为gem定制IRB控制台

时间:2016-09-14 20:56:03

标签: ruby irb

我想通过应用一些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

2 个答案:

答案 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)