6

Is there an easy way to repeat a previous command in Ruby irb? I wish to have something like using exclamation mark (!) in Unix.

Thank you.

4

8 に答える 8

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

次に、replat_last_irbirbコンソールで最後の入力を実行するために使用できます。

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 all io infoを保存し、lineメソッドを使用して入力したすべての行を取得します。

したがって、evalを使用して最後の入力を繰り返すことができます。

于 2012-06-01T10:57:29.367 に答える
8

上矢印を使用すると、履歴が1行ずつ表示されます。Pryにはもっと良いものがありますが、私はまだ試していません。

于 2012-06-01T10:48:24.787 に答える
6

上矢印キーを押して Enter する以外に、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。いつものように、ウィキには hist コマンドに関する詳細情報が含まれています。

于 2012-06-01T11:36:41.443 に答える
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 に答える
3

履歴を数ステップさかのぼるだけでなく、以前のコマンドを繰り返す (または変更する) 最も簡単な方法は、Ctrl+Rに続けて問題のコマンドの部分文字列を入力して検索することです。

GNU Readline ライブラリが提供するその他のキーボード ショートカットについては、こちらを参照してください。これらは、多くのシェルやその他のアプリケーションでもサポートされています。

于 2012-06-01T11:29:46.483 に答える
2

番号付きの履歴サポート(のようなgdb)はないと思いますが、シェルの場合と同じように、矢印キーを使用して履歴をナビゲートできます。

アップデート

私は完全に間違っていることがわかりました、そして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は、あなたが探しているように見える履歴拡張をネイティブにサポートしていません。確実な代替手段として、pryREPLは再生コマンドを提供します。

于 2012-06-01T11:05:10.980 に答える
0

で開始することにより、irbでコマンドをバックトレースすることもできます

irb --トレーサー

これで、irb コマンドを介して上向き矢印が戻ります。(Ruby 2.3.3 を使用)

于 2016-11-29T13:18:25.390 に答える