Могу ли я повторить команду в IRB?

Есть ли простой способ повторить предыдущую команду в Ruby irb? Я хотел бы иметь что-то вроде использования восклицательного знака (!) В Unix.

Спасибо.

8 ответов

Решение
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 > "> 

Этот объект сохраняет всю информацию о io и метод строки, чтобы получить каждую введенную вами строку.

Итак, мы можем использовать eval, чтобы повторить последний ввод.

Стрелка вверх переводит вашу историю построчно. У Прай есть больше вкусностей, но я еще не пробовал.

Помимо нажатия стрелки вверх и ввода, 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 Команда см. вики-страницу, также проверьте входные данные для других трюков, связанных с использованием и манипулированием историей ввода.

Кроме того, если вы хотите просто воспроизвести отдельные строки истории, вы можете сначала просмотреть историю, используя 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.

Самый быстрый способ повторить (или изменить) более раннюю команду, которая более чем на пару шагов назад в истории, - это найти ее, набрав Ctrl+R, а затем некоторую подстроку рассматриваемой команды.

Дополнительные сочетания клавиш, предоставляемые библиотекой GNU Readline, можно найти здесь. Они поддерживаются многими оболочками и другими приложениями.

Несколько связано.

В 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,

Я не думаю, что есть какая-либо нумерованная поддержка истории (например, как gdb), но вы можете использовать клавиши со стрелками для навигации по истории, так же, как вы можете в оболочке.

Обновить

Оказывается, я совершенно не прав, а Хуопо прав; Вы можете получить доступ к истории через 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 REPL изначально не поддерживает расширение истории, что вы, похоже, ищете. Для хорошей альтернативы, pry REPL предлагает команду воспроизведения.

Вы также можете отследить команды в irb, запустив его

irb --tracer

Теперь стрелка вверх вернется через команды irb. (Использование Ruby 2.3.3)

Другие вопросы по тегам