Skip to content

Commit

Permalink
Hint debugger command in irb:rdbg session (#768)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
st0012 authored Nov 23, 2023
1 parent 7d6849e commit fdf24de
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
18 changes: 18 additions & 0 deletions lib/irb/debug.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,24 @@ def DEBUGGER__.capture_frames(*args)
DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB)
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
end

Expand Down
42 changes: 42 additions & 0 deletions test/irb/yamatanooroti/test_rendering.rb
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,48 @@ def test_pager_page_content_doesnt_page_output_when_it_fits_in_the_screen
assert_match(/foobar/, screen)
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

def write_irbrc(content)
Expand Down

0 comments on commit fdf24de

Please sign in to comment.