2012-06-01 21 views

回答

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信息,並用線方法來獲取每行你輸入。

所以,我們可以使用eval重複上一次輸入。

+0

嗨,而不是使用偏移量,我發現我們可以把我們想要重複的行號..謝謝!用額外的方法我可以輕鬆做到! –

7

向上箭頭可逐行獲取歷史記錄。 Pry有更多的好東西,但我還沒有嘗試過。

+0

Ctrl-r也將反向搜索歷史,在IRB和Pry(我認爲這是一個普通的readline功能)。 – d11wtq

+0

@ d11wtq - 我在1.8.7獲得ctrl-r,但不是1.9.3 - 我們輸了嗎?或者我的irb壞了? – seph

+0

我懷疑它是針對不同版本的readline編譯的。對我來說工作得很好。 – d11wtq

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 
+1

ya,我看到irb line命令的數量在不斷增加,並且懷疑重複命令是否有用。 –

+0

@RobertAHenru編輯了我的答案:) – kfb

+0

亞..那工程!謝謝! –

1

irb REPL本身不支持history expansion,這正是您所尋找的。對於一個可靠的替代品,撬REPL提供了replay命令。

2

重複(或修改)更早的命令,它不只是一對夫婦的步驟,早在歷史上更多的最快方法,是通過輸入按Ctrl + [R隨後的一些子尋找它有問題的命令。

有關GNU Readline library提供的更多鍵盤快捷鍵,請參閱here。它們也受許多shell和其他應用程序的支持。

+0

這會很好,但是'irb'不支持Ctrl-R。 – kfb

+1

@r_那是不正確的。 IRB支持Ctrl-R對我來說很好(ruby 1.9.3)。我認爲它實際上是一個readline功能,所以可能取決於您的libreadline版本。 – d11wtq

+0

它已經在libreadline很多年了,所以我會說這更多的是Ruby/IRB是否使用libreadline支持編譯的問題。只要在安裝/編譯Ruby/IRB時安裝libreadline即可。如果沒有libreadline,您可能無法使用箭頭鍵瀏覽歷史記錄。 –

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(用於whateve原因),那麼只需使用:hist --replay -1。一如既往的wiki包含more info on the hist command

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

0

您還可以通過與

IRB --tracer

現在向上的箭頭將回到直通倫理審查委員會的命令啓動它回溯的IRB命令。 (使用Ruby 2.3.3)

相關問題