2012-06-01 5 views
5

क्या रूबी आईआरबी में पिछले कमांड को दोहराने का कोई आसान तरीका है? मैं यूनिक्स में विस्मयादिबोधक चिह्न (!) का उपयोग करने की तरह कुछ करना चाहता हूं।क्या मैं irb में कमांड दोहरा सकता हूं?

धन्यवाद।

उत्तर

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

तो आप replat_last_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 > "> 

इस वस्तु को बचाने आईआरबी सब कब की जानकारी है, और एक लाइन विधि के साथ हर पंक्ति आप इनपुट पाने के लिए।

इसलिए, हम अंतिम इनपुट दोहराने के लिए eval का उपयोग कर सकते हैं।

+0

नमस्ते, ऑफ़सेट का उपयोग करने के बजाय, मैंने पाया कि हम उस लाइन नंबर को डाल सकते हैं जिसे हम दोहराना चाहते हैं .. धन्यवाद! अतिरिक्त विधि के साथ मैं इसे आसानी से कर सकता हूं! –

7

ऊपर तीर आपको रेखा से इतिहास रेखा प्राप्त करता है। प्रिये के पास और अधिक उपहार हैं लेकिन मैंने अभी तक कोशिश नहीं की है।

+0

Ctrl-r इतिहास के माध्यम से आईआरबी और प्राइ दोनों में भी खोज को उलट देगा (मुझे लगता है कि यह एक सामान्य रीडलाइन सुविधा है)। – d11wtq

+0

@ d11wtq - मुझे ctrl-r मिल रहा है 1.8.7 लेकिन 1.9.3 नहीं - क्या हमने इसे खो दिया? या मेरा irb टूटा हुआ है? – seph

+0

मुझे संदेह है कि इसे रीडलाइन के एक अलग संस्करण के खिलाफ संकलित किया गया है। मेरे लिए ठीक काम करता है। – 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

या, मुझे लगता है कि आईआरबी लाइन कमांड में बढ़ती संख्या है, यह सोचकर कि यह आदेश दोहराने के लिए उपयोगी है या नहीं। –

+0

@RobertAHenru ने मेरा जवाब संपादित किया :) – kfb

+0

या .. यह काम करता है! धन्यवाद! –

1

irb REPL मूल रूप से history expansion का समर्थन नहीं करता है, जो आप ढूंढ रहे हैं। एक ठोस विकल्प के लिए, pry REPL replay कमांड प्रदान करता है।

2

दोहराने के लिए (या संशोधित) पहले के एक आदेश है कि चरणों इतिहास में वापस बस कुछ की तुलना में अधिक है तेज तरीका, टाइपिंग Ctrl +आर से कुछ-स्ट्रिंग के बाद से इसके लिए खोज करने के लिए है प्रश्न में आदेश।

GNU Readline library द्वारा प्रदान किए गए अधिक कीबोर्ड शॉर्टकट के लिए, here देखें। वे कई गोले और अन्य अनुप्रयोगों द्वारा भी समर्थित हैं।

+0

यह अच्छा होगा, लेकिन Ctrl-R 'irb' में समर्थित नहीं है। – kfb

+1

@r_ यह सच नहीं है। आईआरबी मेरे लिए बस ठीक-ठीक (रूबी 1.9.3) का समर्थन करता है। मुझे लगता है कि यह वास्तव में एक पठार सुविधा है, इसलिए शायद libreadline के अपने संस्करण पर निर्भर करता है। – d11wtq

+0

यह कई सालों से लिब्रेडलाइन में रहा है, इसलिए मैं कहूंगा कि रूबी/आईआरबी को लिब्रेडलाइन समर्थन के साथ संकलित किया गया था या नहीं। जब तक आप रूबी/आईआरबी स्थापित/संकलित करते हैं, तब तक आपके पास libreadline स्थापित होना चाहिए। Libreadline के बिना आप शायद इतिहास को नेविगेट करने के लिए तीर कुंजियों का उपयोग करने में सक्षम नहीं होंगे। –

6
एक तरफ तीर दबाकर और प्रवेश से

, Pry आरईपीएल चलो तुम (बस लाइनों के बजाय) पूरे भाव उत्तर 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। हमेशा विकी में 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

तुम भी

आईआरबी --tracer

अब ऊपर तीर आईआरबी आदेशों के माध्यम से वापस जाना होगा के साथ इसे शुरू करने से आईआरबी में आदेश पश्व-अनुरेखन कर सकते हैं। (रूबी 2.3.3 का उपयोग करना)

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^