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.
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 all io infoを保存し、lineメソッドを使用して入力したすべての行を取得します。
したがって、evalを使用して最後の入力を繰り返すことができます。
上矢印を使用すると、履歴が1行ずつ表示されます。Pryにはもっと良いものがありますが、私はまだ試していません。
上矢印キーを押して 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 コマンドに関する詳細情報が含まれています。
多少関係あり。
では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
.
履歴を数ステップさかのぼるだけでなく、以前のコマンドを繰り返す (または変更する) 最も簡単な方法は、Ctrl+Rに続けて問題のコマンドの部分文字列を入力して検索することです。
GNU Readline ライブラリが提供するその他のキーボード ショートカットについては、こちらを参照してください。これらは、多くのシェルやその他のアプリケーションでもサポートされています。
番号付きの履歴サポート(のような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
で開始することにより、irbでコマンドをバックトレースすることもできます
irb --トレーサー
これで、irb コマンドを介して上向き矢印が戻ります。(Ruby 2.3.3 を使用)