6

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

谢谢你。

4

8 回答 8

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

然后你可以replat_last_irb在你的 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 > "> 

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

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

于 2012-06-01T10:57:29.367 回答
8

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

于 2012-06-01T10:48:24.787 回答
6

除了按向上箭头并输入之外,Pryplay -i REPL 让您使用以下命令回复整个表达式(而不仅仅是行) :

看这里:

[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 页面,还可以查看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 包含有关 hist 命令的更多信息

于 2012-06-01T11:36:41.443 回答
3

重复(或修改)一个较早的命令的最快方法是在历史记录中输入多于几步的命令,即通过键入Ctrl+R后跟相关命令的某些子字符串来搜索它。

有关GNU Readline 库提供的更多键盘快捷键,请查看此处。许多 shell 和其他应用程序也支持它们。

于 2012-06-01T11:29:46.483 回答
3

有点相关。

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.

于 2012-06-01T12:36:31.647 回答
2

我认为没有任何编号的历史支持(例如 like 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 
于 2012-06-01T10:49:01.153 回答
1

irb REPL 本身并不支持历史扩展,这正是您所寻找的。作为一个可靠的替代方案,pry REPL 提供了replay命令。

于 2012-06-01T11:05:10.980 回答
0

您还可以通过启动它来回溯 irb 中的命令

irb——示踪剂

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

于 2016-11-29T13:18:25.390 回答