[ruby/irb] Hint debugger command in irb:rdbg session
(https://github.com/ruby/irb/pull/768) When user enters irb:rdbg session, they don't get the same hint that the `debug` gem provides, like ``` (rdbg) n # next command ``` This means that users may accidentally execute commands when they want to retrieve the value of a variable. So this commit adds a Reline output modifier to add a simiar hint: ``` irb:rdbg(main):002> n # debug command ``` It is not exactly the same as `debug`'s because in this case the importance is to help users distinguish between value evaluation and debugger command execution. https://github.com/ruby/irb/commit/fdf24de851
This commit is contained in:
parent
e2078ccd5a
commit
e8b9058964
@ -57,6 +57,24 @@ module IRB
|
|||||||
DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB)
|
DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if !@output_modifier_defined && !DEBUGGER__::CONFIG[:no_hint]
|
||||||
|
irb_output_modifier_proc = Reline.output_modifier_proc
|
||||||
|
|
||||||
|
Reline.output_modifier_proc = proc do |output, complete:|
|
||||||
|
unless output.strip.empty?
|
||||||
|
cmd = output.split(/\s/, 2).first
|
||||||
|
|
||||||
|
if DEBUGGER__.commands.key?(cmd)
|
||||||
|
output = output.sub(/\n$/, " # debug command\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
irb_output_modifier_proc.call(output, complete: complete)
|
||||||
|
end
|
||||||
|
|
||||||
|
@output_modifier_defined = true
|
||||||
|
end
|
||||||
|
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -379,6 +379,48 @@ class IRB::RenderingTest < Yamatanooroti::TestCase
|
|||||||
assert_match(/foobar/, screen)
|
assert_match(/foobar/, screen)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_debug_integration_hints_debugger_commands
|
||||||
|
write_irbrc <<~'LINES'
|
||||||
|
IRB.conf[:USE_COLORIZE] = false
|
||||||
|
LINES
|
||||||
|
script = Tempfile.create(["debug", ".rb"])
|
||||||
|
script.write <<~RUBY
|
||||||
|
puts 'start IRB'
|
||||||
|
binding.irb
|
||||||
|
RUBY
|
||||||
|
script.close
|
||||||
|
start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{script.to_path}}, startup_message: 'start IRB')
|
||||||
|
write("debug\n")
|
||||||
|
write("n")
|
||||||
|
close
|
||||||
|
|
||||||
|
screen = result.join("\n").sub(/\n*\z/, "\n")
|
||||||
|
assert_include(screen, "irb:rdbg(main):002> n # debug command")
|
||||||
|
ensure
|
||||||
|
File.unlink(script) if script
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_debug_integration_doesnt_hint_non_debugger_commands
|
||||||
|
write_irbrc <<~'LINES'
|
||||||
|
IRB.conf[:USE_COLORIZE] = false
|
||||||
|
LINES
|
||||||
|
script = Tempfile.create(["debug", ".rb"])
|
||||||
|
script.write <<~RUBY
|
||||||
|
puts 'start IRB'
|
||||||
|
binding.irb
|
||||||
|
RUBY
|
||||||
|
script.close
|
||||||
|
start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{script.to_path}}, startup_message: 'start IRB')
|
||||||
|
write("debug\n")
|
||||||
|
write("foo")
|
||||||
|
close
|
||||||
|
|
||||||
|
screen = result.join("\n").sub(/\n*\z/, "\n")
|
||||||
|
assert_include(screen, "irb:rdbg(main):002> foo\n")
|
||||||
|
ensure
|
||||||
|
File.unlink(script) if script
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def write_irbrc(content)
|
def write_irbrc(content)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user