加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 为gem定制IRB控制台

发布时间:2020-12-16 21:07:20 所属栏目:百科 来源:网络整理
导读:我想通过应用一些IRB配置选项来扩展作为bundle gem标准构建的默认控制台应用程序. Looking at the documentation,我可以看到应该可以更改提示,这在交互式会话中工作正常.例如,我可以像这样播放显示的提示: 2.1.4 :001 conf.prompt_mode=:SIMPLE= :SIMPLE? c
我想通过应用一些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

解决方法

您可以通过两种方式应用自定义配置.

第一个是使用irbrc file.构建控制台应用程序可能很棘手(从ruby文件调用IRB.start而不是从控制台调用irb).

第二个是你在帖子中描述的方法.您可以根据the original one编写自己的IRB :: start方法.与使用未记录的API完全相同的潜在问题 – 将来可能会破坏更新版本的irb.

您应该考虑是否真的需要在irb的顶部构建一个控制台应用程序.例如,您可以使用Pry解决此问题.在启动交互式会话之前允许define configuration.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读