Ruby 我可以在irb中重复命令吗?

Ruby 我可以在irb中重复命令吗?,ruby,irb,Ruby,Irb,有没有一种简单的方法可以在Ruby irb中重复前面的命令? 我希望在Unix中使用感叹号(!)之类的东西 谢谢。向上箭头会逐行显示历史记录。Pry有更多的好东西,但我还没有尝试过。我不认为有任何类型的编号历史支持(比如像gdb),但是你可以使用箭头键在历史中导航,就像在shell中一样 更新 结果证明我完全错了,而胡波是对的;您可以通过IRB.CurrentContext.io.line方法访问历史记录,因此 eval IRB.CurrentContext.io.line <line n

有没有一种简单的方法可以在Ruby irb中重复前面的命令? 我希望在Unix中使用感叹号(!)之类的东西


谢谢。

向上箭头会逐行显示历史记录。Pry有更多的好东西,但我还没有尝试过。

我不认为有任何类型的编号历史支持(比如像
gdb
),但是你可以使用箭头键在历史中导航,就像在shell中一样

更新

结果证明我完全错了,而胡波是对的;您可以通过
IRB.CurrentContext.io.line
方法访问历史记录,因此

eval IRB.CurrentContext.io.line <line number>
然后

然后,您可以在irb控制台中使用
replat\u last\u irb
来运行上次输入

IRB.CurrentContext.io如下所示:

ruby-1.9.3-p0 :001 > def hello
ruby-1.9.3-p0 :002?>   end
 => nil 
ruby-1.9.3-p0 :003 > IRB.CurrentContext.io
 => #<IRB::ReadlineInputMethod:0x00000001c7b860 @file_name="(line)", @line_no=3, @line=[nil, "def hello\n", "end\n", "IRB.CurrentContext.io\n"], @eof=false, @stdin=#<IO:fd 0>, @stdout=#<IO:fd 1>, @prompt="ruby-1.9.3-p0 :003 > "> 
ruby-1.9.3-p0:001>def hello
ruby-1.9.3-p0:002?>结束
=>零
ruby-1.9.3-p0:003>IRB.CurrentContext.io
=> # 
此对象保存irb所有io信息,并使用line方法获取您输入的每一行


因此,我们可以使用eval重复上一次输入。

irb REPL本机不支持,这正是您想要的。对于可靠的替代方案,pry-REPL提供了命令。

重复(或修改)历史上早几步的命令的最快方法是键入Ctrl+R,然后键入相关命令的某个子字符串来搜索该命令


有关提供的更多键盘快捷键,请参见。许多Shell和其他应用程序也支持它们。

除了按向上箭头键和enter键外,REPL让您使用
play-i
命令回复整个表达式(而不仅仅是行):

请看这里:

[31] (pry) main: 0> (1..5).map do |v|
[31] (pry) main: 0*   v * 2
[31] (pry) main: 0* end  
=> [2, 4, 6, 8, 10]
[32] (pry) main: 0> play -i 31
=> [2, 4, 6, 8, 10]
[33] (pry) main: 0> 
只需将要重播的代码的表达式编号(提示符旁边的
[]
中的编号)传递给
play-i

有关
play
命令的更多信息,请参阅,也可以查看,以了解与使用和操作输入历史记录相关的其他技巧

或者,如果只想重放历史记录的各个行,可以先使用
hist
命令查看历史记录,然后使用
hist--replay
重放历史记录,如下所示:

[37] (pry) main: 0> puts "hello world"
hello world
=> nil
[38] (pry) main: 0> hist --tail
9699: _file_
9700: (1..10).map do |v|
9701: (1..5).map do |v|
9702:   v * 2
9703: end
9704: play -i 31
9705: _
9706: hist --tail
9707: hist -r
9708: puts "hello world"
[39] (pry) main: 0> hist --replay 9708
hello world
=> nil
[41] (pry) main: 0> 
或者,如果您只想重播最后一行输入,而不想使用
向上箭头
(出于任何原因),则只需使用:
hist--replay-1
。wiki总是包含一些相关的内容

IRB
中,最后执行的命令的结果保存在
中。你也可以用那个

范例

1.9.3p194 :001 > 2 + 2
 => 4 
1.9.3p194 :002 > _
 => 4 
1.9.3p194 :003 > _ * 3
 => 12 
1.9.3p194 :004 > _
 => 12 

这对我来说非常有用,尤其是在
rails控制台

中,您还可以通过从

irb——示踪剂

现在,向上箭头将通过irb命令返回。
(使用Ruby 2.3.3)

ya,我看到irb行命令的数量越来越多,不知道重复该命令是否有用。假设我想在启动irb时自动加载此方法定义,知道怎么做吗?您的
R004
004
解释为八进制。小心点。这很好,但是在
irb
@R\ux中不支持Ctrl-R。这是不正确的。IRB对Ctrl-R的支持对我来说很好(ruby 1.9.3)。我认为它实际上是一个readline功能,所以可能取决于您的libreadline版本。它已经在libreadline中使用了很多年,所以我想说更多的问题是Ruby/IRB是否是使用libreadline支持编译的。在安装/编译Ruby/IRB时,只要安装了libreadline就可以了。如果没有libreadline,您可能也无法使用箭头键浏览历史。啊,我的错误——我在构建Ruby时没有libreadline,所以我没有意识到我缺少这个功能!谢谢你的提醒!Ctrl-r还将在IRB和Pry中反向搜索历史记录(我假设这是一个通用的readline功能)。@d11wtq-我在1.8.7中得到了Ctrl-r,但不是1.9.3-我们丢失了吗?还是我的irb坏了?我怀疑它是针对不同版本的readline编译的。适合我。@d11wtq-谢谢。我必须看看我是否能把它拿回来。@d11wtq-在这里找到了答案,以防有人感兴趣(osx特定):嗨,我发现我们可以把要重复的行号放在这里,而不是使用偏移量。。谢谢用额外的方法我可以很容易地做到!
[31] (pry) main: 0> (1..5).map do |v|
[31] (pry) main: 0*   v * 2
[31] (pry) main: 0* end  
=> [2, 4, 6, 8, 10]
[32] (pry) main: 0> play -i 31
=> [2, 4, 6, 8, 10]
[33] (pry) main: 0> 
[37] (pry) main: 0> puts "hello world"
hello world
=> nil
[38] (pry) main: 0> hist --tail
9699: _file_
9700: (1..10).map do |v|
9701: (1..5).map do |v|
9702:   v * 2
9703: end
9704: play -i 31
9705: _
9706: hist --tail
9707: hist -r
9708: puts "hello world"
[39] (pry) main: 0> hist --replay 9708
hello world
=> nil
[41] (pry) main: 0> 
1.9.3p194 :001 > 2 + 2
 => 4 
1.9.3p194 :002 > _
 => 4 
1.9.3p194 :003 > _ * 3
 => 12 
1.9.3p194 :004 > _
 => 12