Могу ли я повторить команду в 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)