2012-06-01 16 views

答えて

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

、あなたは最後の入力を実行するために、あなたの中にIRBコンソールをreplat_last_irbを使用することができます。

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情報をIRB保存し、あなたの入力すべての行を取得するために定額法で:

IRB.CurrentContext.ioは以下のようです。

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

+0

こんにちは、オフセットを使用するのではなく、繰り返したい行番号を置くことができます。ありがとう!私はそれを簡単に行うことができる追加の方法で! –

7

上向きの矢印は、1行ずつの履歴を取得します。 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など)はありませんが、矢印キーを使用してシェル内での操作と同じように履歴をナビゲートすることができます。

更新

は、私は完全に間違っているが判明し、そして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ラインコマンドが増加する数を持っていることがわかります。 –

+0

@RobertAHenruは私の答えを編集しました:) – kfb

+0

ya .. that works!どうも! –

1

irb REPLはネイティブにhistory expansionをサポートしていませんが、あなたが探しているようです。堅実な代替手段として、REPLはreplayコマンドを提供しています。

2

バック歴史の中でのステップだけのカップルよりもある、以前のコマンドを繰り返す(または変更)する最も簡単な方法は、いくつかのサブ続いはCtrl +Rを入力して検索することです問題のコマンド。

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

+0

いいですが、Ctrl-Rは 'irb'ではサポートされていません。 – 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をチェックしてください見ます

また
[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> 

、あなただけの最後の行の入力を再生したい、とあなたはwhateveのために(up arrowを使用したくない場合は、次のようにhist --replayを使用して、それを再生し、その後histコマンドを使用し、歴史r理由)を使用してください: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コマンドスルー戻ります今まで矢印でそれを開始することにより、IRBのコマンドをバックトレースすることができます。 (Ruby 2.3.3を使用)

関連する問題