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

时间:2012-06-01 10:39:18

标签: ruby irb

有没有一种简单的方法可以在Ruby irb中重复上一个命令? 我希望在Unix中使用感叹号(!)。

谢谢。

8 个答案:

答案 0 :(得分:11)

def repeat_last_irb
  eval(IRB.CurrentContext.io.line(-2))
end

然后您可以在irb控制台中使用replat_last_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 > "> 

此对象保存所有io信息,并使用线方法获取您输入的每一行。

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

答案 1 :(得分:8)

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

答案 2 :(得分:6)

除了按向上箭头并输入外,Pry 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命令的详情,请参阅wiki page,查看Entering input了解与使用和操作输入历史相关的其他技巧

或者,如果您只想重播各个历史记录行,可以先使用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> 

或者,如果您只想重播最后一行输入,并且您不想使用up arrow(无论出于何种原因),那么只需使用:hist --replay -1。与往常一样,wiki包含more info on the hist command

答案 3 :(得分:3)

重复(或修改)早期命令的最快捷方式是通过输入 Ctrl + R来搜索它。 / kbd>后面是相关命令的一些子字符串。

要获得GNU Readline library提供的更多键盘快捷键,请查看here。它们也受到许多shell和其他应用程序的支持。

答案 4 :(得分:2)

我认为没有任何编号的历史记录支持(例如像gdb),但您可以使用箭头键浏览历史记录,就像在shell中一样。

<强>更新

原来我完全错了,Hooopo是对的;您可以通过IRB.CurrentContext.io.line方法访问历史记录,所以

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

将重复该命令。正如Hooopo所说,在方法中包装它可以正常工作:

def r(number)
  eval IRB.CurrentContext.io.line number
end

然后

ruby-1.9.3-p0 :004 > puts "hello"
hello
 => nil 
ruby-1.9.3-p0 :005 > r 004 # (or 'r 4')
hello
 => nil 

答案 5 :(得分:2)

有点相关。

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 console

答案 6 :(得分:1)

irb REPL本身不支持history expansion,这正是您所寻找的。对于一个可靠的替代方案,pry REPL提供replay命令。

答案 7 :(得分:0)

您也可以通过

启动来回溯irb中的命令

irb --tracer

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