module Byebug
# Mix-in module to showing settings
module ShowFunctions
def show_setting(setting_name)
case setting_name
when /^annotate$/
Byebug.annotate ||= 0
return ("Annotation level is #{Byebug.annotate}")
when /^args$/
if Command.settings[:argv] and Command.settings[:argv].size > 0
if defined?(Byebug::BYEBUG_SCRIPT)
# byebug was called initially. 1st arg is script name.
args = Command.settings[:argv][1..-1].join(' ')
else
# byebug wasn't called initially. 1st arg is not script name.
args = Command.settings[:argv].join(' ')
end
else
args = ''
end
return "Argument list to give program being debugged when it is started is \"#{args}\"."
when /^autolist$/
on_off = Command.settings[:autolist] > 0
return "autolist is #{show_onoff(on_off)}."
when /^autoeval$/
on_off = Command.settings[:autoeval]
return "autoeval is #{show_onoff(on_off)}."
when /^autoreload$/
on_off = Command.settings[:autoreload]
return "autoreload is #{show_onoff(on_off)}."
when /^autoirb$/
on_off = Command.settings[:autoirb] > 0
return "autoirb is #{show_onoff(on_off)}."
when /^basename$/
on_off = Command.settings[:basename]
return "basename is #{show_onoff(on_off)}."
when /^callstyle$/
style = Command.settings[:callstyle]
return "Frame call-display style is #{style}."
when /^commands(:?\s+(\d+))?$/
if @state.interface.readline_support?
s = '';
args = @match[1].split
if args[1]
first_line = args[1].to_i - 4
last_line = first_line + 10 - 1
if first_line > Readline::HISTORY.length
first_line = last_line = Readline::HISTORY.length
elsif first_line <= 0
first_line = 1
end
if last_line > Readline::HISTORY.length
last_line = Readline::HISTORY.length
end
i = first_line
commands = Readline::HISTORY.to_a[first_line..last_line]
else
if Readline::HISTORY.length > 10
commands = Readline::HISTORY.to_a[-10..-1]
i = Readline::HISTORY.length - 10
else
commands = Readline::HISTORY.to_a
i = 1
end
end
commands.each do |cmd|
s += ("%5d %s\n" % [i, cmd])
i += 1
end
else
s='No readline support'
end
return s
when /^testing$/
on_off = Command.settings[:testing]
return "Currently testing byebug is #{show_onoff(on_off)}."
when /^forcestep$/
on_off = self.class.settings[:force_stepping]
return "force-stepping is #{show_onoff(on_off)}."
when /^fullpath$/
on_off = Command.settings[:frame_fullpath]
return "Displaying frame's full file names is #{show_onoff(on_off)}."
when /^history(:?\s+(filename|save|size))?$/
args = @match[1].split
interface = @state.interface
if args[1]
show_save = show_size = show_filename = false
prefix = false
if args[1] == "save"
show_save = true
elsif args[1] == "size"
show_size = true
elsif args[1] == "filename"
show_filename = true
end
else
show_save = show_size = show_filename = true
prefix = true
end
s = []
if show_filename
msg = "#{prefix ? 'filename:' : ''} The command history file is " \
"#{interface.histfile.inspect}"
s << msg
end
if show_save
msg = (prefix ? "save: " : "") +
"Saving of history save is #{show_onoff(interface.history_save)}."
s << msg
end
if show_size
msg = (prefix ? "size: " : "") +
"Byebug history size is #{interface.history_length}"
s << msg
end
return s.join("\n")
when /^linetrace$/
on_off = Byebug.tracing?
return "line tracing is #{show_onoff(on_off)}."
when /^linetrace\+$/
on_off = Command.settings[:tracing_plus]
if on_off
return "line tracing style is different consecutive lines."
else
return "line tracing style is every line."
end
when /^listsize$/
listlines = Command.settings[:listsize]
return "Number of source lines to list is #{listlines}."
when /^trace$/
on_off = Command.settings[:stack_trace_on_error]
return "Displaying stack trace is #{show_onoff(on_off)}."
when /^version$/
return "byebug #{Byebug::VERSION}"
when /^width$/
return "width is #{Command.settings[:width]}."
else
return "Unknown show subcommand #{setting_name}."
end
end
end
# Implements byebug "show" command.
class ShowCommand < Command
Subcommands =
[
['annotate', 2, 'Show annotation level',
'0 == normal;' \
'2 == output annotated suitably for use by programs that control ' \
'byebug.'],
['args', 2,
'Show argument list to give to the program being debugged when it ' \
'is started',
'Follow this command with any number of args to be passed to the ' \
'program.'],
['autoeval', 4, 'Show whether unrecognized commands are evaluated'],
['autolist', 4, 'Show whether "list" command is run on stopping'],
['autoirb', 4, 'Show whether IRB is invoked on stopping'],
['autoreload', 4, 'Show whether source code is reloaded when changed'],
['basename', 1, 'Show whether basename is used when reporting files'],
['callstyle', 2, 'Show paramater style used when showing call frames'],
['commands', 2, 'Show the history of commands you typed',
'You can supply a command number to start with.'],
['forcestep', 1, 'Show whether "next/step" force to move onto a new ' \
'line'],
['fullpath', 2, 'Show whether full paths are displayed in frames'],
['history', 2, 'Generic command to show command history parameters',
'show history filename -- Show the filename in which to record the ' \
'command history.' \
'show history save -- Show whether history record should be saved ' \
'on exit.' \
'show history size -- Show the size of the command history.'],
['keep-frame-bindings', 1, 'Save frame binding on each call'],
['linetrace', 3, 'Show line execution tracing'],
['linetrace+', 10,
'Show whether different consecutive lines are shown in tracing'],
['listsize', 3, 'Show number of source lines to list by default.'],
['port', 3, 'Show server port'],
['post-mortem', 3,
'Show whether we go into post-mortem debugging on an uncaught ' \
'exception'],
['trace', 1,
'Show whether a stack trace is displayed when "eval" raises an ' \
'exception'],
['version', 1, 'Show byebug\'s version'],
['width', 1, 'Show the number of characters per line for byebug']
].map do |name, min, short_help, long_help|
SubcmdStruct.new(name, min, short_help, long_help)
end unless defined?(Subcommands)
self.allow_in_control = true
def regexp
/^show (?: \s+ (.+) )?$/xi
end
def execute
if not @match[1]
print format_subcmds(Subcommands)
else
args = @match[1].split(/[ \t]+/)
param = args.shift
subcmd = find(Subcommands, param)
if subcmd
print "%s\n" % show_setting(subcmd.name)
else
print "Unknown show command #{param}\n"
end
end
end
def help(args)
if args[1]
subcmd = find(Subcommands, args[1])
return "Invalid \"show\" subcommand \"#{args[1]}\"." unless subcmd
str = subcmd.short_help + '.'
str += "\n" + subcmd.long_help if subcmd.long_help
return str
end
ShowCommad.description + format_subcmds(Subcommands)
end
class << self
def names
%w(show)
end
def description
%{
Generic command for showing things about byebug.
}
end
end
end
end