byebug 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +4 -0
  2. data/.travis.yml +0 -5
  3. data/CHANGELOG.md +6 -0
  4. data/Gemfile +1 -1
  5. data/LICENSE +23 -20
  6. data/byebug.gemspec +5 -5
  7. data/ext/byebug/breakpoint.c +102 -134
  8. data/ext/byebug/byebug.c +110 -64
  9. data/ext/byebug/byebug.h +2 -3
  10. data/ext/byebug/context.c +72 -39
  11. data/lib/byebug.rb +34 -38
  12. data/lib/byebug/command.rb +19 -24
  13. data/lib/byebug/commands/breakpoints.rb +11 -12
  14. data/lib/byebug/commands/catchpoint.rb +1 -1
  15. data/lib/byebug/commands/control.rb +2 -4
  16. data/lib/byebug/commands/finish.rb +1 -1
  17. data/lib/byebug/commands/frame.rb +15 -17
  18. data/lib/byebug/commands/info.rb +29 -28
  19. data/lib/byebug/commands/irb.rb +23 -21
  20. data/lib/byebug/commands/method.rb +4 -4
  21. data/lib/byebug/commands/reload.rb +8 -6
  22. data/lib/byebug/commands/set.rb +27 -23
  23. data/lib/byebug/commands/show.rb +6 -4
  24. data/lib/byebug/commands/stepping.rb +2 -2
  25. data/lib/byebug/commands/threads.rb +10 -10
  26. data/lib/byebug/commands/trace.rb +13 -14
  27. data/lib/byebug/commands/variables.rb +14 -12
  28. data/lib/byebug/context.rb +2 -15
  29. data/lib/byebug/interface.rb +5 -0
  30. data/lib/byebug/processor.rb +59 -64
  31. data/lib/byebug/version.rb +2 -1
  32. data/old_doc/Makefile +20 -0
  33. data/{man/rdebug.1 → old_doc/byebug.1} +5 -5
  34. data/old_doc/byebug.html +6178 -0
  35. data/old_doc/byebug.texi +3775 -0
  36. data/{doc → old_doc}/hanoi.rb +0 -0
  37. data/{doc → old_doc}/primes.rb +0 -0
  38. data/{doc → old_doc}/test-tri2.rb +0 -0
  39. data/{doc → old_doc}/tri3.rb +0 -0
  40. data/{doc → old_doc}/triangle.rb +0 -0
  41. data/test/breakpoints_test.rb +96 -60
  42. data/test/conditions_test.rb +15 -12
  43. data/test/examples/info.rb +5 -5
  44. data/test/examples/stepping.rb +1 -1
  45. data/test/frame_test.rb +40 -39
  46. data/test/info_test.rb +105 -96
  47. data/test/irb_test.rb +66 -61
  48. data/test/jump_test.rb +18 -9
  49. data/test/list_test.rb +114 -107
  50. data/test/restart_test.rb +51 -58
  51. data/test/save_test.rb +8 -7
  52. data/test/set_test.rb +8 -11
  53. data/test/show_test.rb +3 -5
  54. data/test/stepping_test.rb +43 -53
  55. data/test/support/context.rb +1 -0
  56. data/test/support/processor.rb +10 -4
  57. data/test/support/test_dsl.rb +46 -18
  58. data/test/support/test_interface.rb +8 -5
  59. data/test/test_helper.rb +2 -2
  60. data/test/trace_test.rb +123 -124
  61. metadata +39 -17
  62. data/AUTHORS +0 -10
  63. data/doc/rdebug-emacs.texi +0 -1030
@@ -1,6 +1,6 @@
1
1
  module Byebug
2
2
 
3
- class CatchCommand < Command # :nodoc:
3
+ class CatchCommand < Command
4
4
  self.allow_in_control = true
5
5
 
6
6
  def regexp
@@ -28,7 +28,7 @@ module Byebug
28
28
  print "Ruby program #{Byebug::PROG_SCRIPT} not executable... " \
29
29
  "We'll add a call to Ruby.\n"
30
30
  ruby = begin defined?(Gem) ? Gem.ruby : "ruby" rescue "ruby" end
31
- rdebug_script = "#{ruby} -I#{$:.join(' -I')} #{prog_script}"
31
+ rdebug_script = "#{ruby} -I#{$:.join(' -I')} #{Byebug::PROG_SCRIPT}"
32
32
  else
33
33
  rdebug_script = Byebug::PROG_SCRIPT
34
34
  end
@@ -52,11 +52,9 @@ module Byebug
52
52
  argv = Command.settings[:argv]
53
53
  end
54
54
  end
55
- args = argv.join(' ')
55
+ cmd = "#{rdebug_script} #{argv.compact.join(' ')}"
56
56
 
57
57
  # An execv would be preferable to the "exec" below.
58
- cmd = "#{rdebug_script} #{args}"
59
- p "cmd: #{cmd}"
60
58
  print "Re exec'ing:\n\t#{cmd}\n"
61
59
  exec cmd
62
60
  rescue Errno::EOPNOTSUPP
@@ -1,6 +1,6 @@
1
1
  module Byebug
2
2
 
3
- # Implements the byebug 'finish' command.
3
+ # Implements byebug's 'finish' command.
4
4
  class FinishCommand < Command
5
5
  self.allow_in_post_mortem = false
6
6
  self.need_context = true
@@ -1,7 +1,7 @@
1
1
  module Byebug
2
2
 
3
3
  # Mix-in module to assist in command parsing.
4
- module FrameFunctions # :nodoc:
4
+ module FrameFunctions
5
5
 
6
6
  def adjust_frame(frame_pos, absolute, context=@state.context)
7
7
  @state.frame_pos = 0 if context != @state.context
@@ -33,7 +33,6 @@ module Byebug
33
33
  print_frame(@state.frame_pos, true)
34
34
  end
35
35
 
36
- # XXX: Implement args and locals for this to be used...
37
36
  def get_frame_call(prefix, pos, context)
38
37
  id = context.frame_method(pos)
39
38
  klass = context.frame_class(pos)
@@ -92,23 +91,22 @@ module Byebug
92
91
  end
93
92
  end
94
93
 
95
- frame_num = "#%d " % pos
96
- #call_str = get_frame_call(frame_num, pos, context)
97
- file_line = "at line %s:%d\n" % [CommandProcessor.canonic_file(file), line]
94
+ frame_num = "##{pos}"
95
+ call_str = get_frame_call(frame_num, pos, context)
96
+ file_line = "at line #{CommandProcessor.canonic_file(file)}:#{line}\n"
98
97
  print frame_num
99
- #unless call_str.empty?
100
- # print call_str
101
- # print ' '
102
- # if call_str.size + frame_num.size + file_line.size > self.class.settings[:width]
103
- # print "\n "
104
- # end
105
- #end
106
- print file_line
107
- if ENV['EMACS'] && adjust
108
- fmt = (Byebug.annotate.to_i > 1 ?
109
- "\032\032source %s:%d\n" : "\032\032%s:%d\n")
110
- print fmt % [CommandProcessor.canonic_file(file), line]
98
+ unless call_str.empty?
99
+ print call_str
100
+ if call_str.size + frame_num.size + file_line.size > self.class.settings[:width]
101
+ print "\n "
102
+ end
111
103
  end
104
+ print file_line
105
+ #if ENV['EMACS'] && adjust
106
+ # fmt = (Byebug.annotate.to_i > 1 ?
107
+ # "\032\032source %s:%d\n" : "\032\032%s:%d\n")
108
+ # print fmt % [CommandProcessor.canonic_file(file), line]
109
+ #end
112
110
  end
113
111
 
114
112
  # Check if call stack is truncated. This can happen if
@@ -1,16 +1,15 @@
1
1
  module Byebug
2
- module InfoFunctions # :nodoc:
2
+
3
+ module InfoFunctions
3
4
  def info_catch(*args)
4
5
  unless @state.context
5
6
  print "No frame selected.\n"
6
7
  return
7
8
  end
8
9
  if Byebug.catchpoints and not Byebug.catchpoints.empty?
9
- # FIXME: show whether Exception is valid or not
10
- # print "Exception: is_a?(Class)\n"
11
10
  Byebug.catchpoints.each do |exception, hits|
12
- # print "#{exception}: #{exception.is_a?(Class)}\n"
13
- print "#{exception}\n"
11
+ print "#{exception}: #{exception.is_a?(Class)}\n"
12
+ #print "#{exception}\n"
14
13
  end
15
14
  else
16
15
  print "No exceptions set to be caught.\n"
@@ -24,15 +23,15 @@ module Byebug
24
23
  Subcommands =
25
24
  [
26
25
  ['args', 1, 'Argument variables of current stack frame'],
27
- ['breakpoints', 1, 'Status of user-settable breakpoints','
28
- Without argument, list info about all breakpoints. With an integer argument,
29
- list info on that breakpoint.'],
26
+ ['breakpoints', 1, 'Status of user-settable breakpoints',
27
+ 'Without argument, list info about all breakpoints. With an integer ' \
28
+ 'argument, list info on that breakpoint.'],
30
29
  ['catch', 3, 'Exceptions that can be caught in the current stack frame'],
31
30
  ['display', 2, 'Expressions to display when program stops'],
32
- ['file', 4, 'Info about a particular file read in','
33
- After the file name is supplied, you can list file attributes that you wish to
34
- see. Attributes include: "all", "basic", "breakpoint", "lines", "mtime", "path"
35
- and "sha1".'],
31
+ ['file', 4, 'Info about a particular file read in',
32
+ 'After the file name is supplied, you can list file attributes that ' \
33
+ 'you wish to see. Attributes include: "all", "basic", "breakpoint", ' \
34
+ '"lines", "mtime", "path" and "sha1".'],
36
35
  ['files', 5, 'File names and timestamps of files read in'],
37
36
  ['global_variables', 2, 'Global variables'],
38
37
  ['instance_variables', 2,
@@ -42,16 +41,18 @@ and "sha1".'],
42
41
  ['locals', 2, 'Local variables of the current stack frame'],
43
42
  ['program', 2, 'Execution status of the program'],
44
43
  ['stack', 2, 'Backtrace of the stack'],
45
- # ['thread', 6, 'List info about thread NUM', '
46
- #If no thread number is given, we list info for all threads. \'terse\' and
47
- #\'verbose\' options are possible. If \'terse\', just give summary thread name
48
- #information. See "help info threads" for more detail about this summary
49
- #information. If \'verbose\' appended to the end of the command, then the entire
50
- #stack trace is given for each thread.'],
51
- # ['threads', 7, 'information of currently-known threads', '
52
- #This information includes whether the thread is the current thread (+), is
53
- #suspended ($) or is ignored (!), plus the thread number and the top stack item.
54
- #If \'verbose\' is given then the entire stack frame is shown.'],
44
+ # ['thread', 6, 'List info about thread NUM',
45
+ # 'If no thread number is given, we list info for all threads. ' \
46
+ # '\'terse\' and \'verbose\' options are possible. If \'terse\', just ' \
47
+ # 'give summary thread name information. See "help info threads" for ' \
48
+ # 'more detail about this summary information. If \'verbose\' appended ' \
49
+ # 'to the end of the command, then the entire stack trace is given for ' \
50
+ # 'each thread.'],
51
+ # ['threads', 7, 'information of currently-known threads',
52
+ # 'This information includes whether the thread is the current thread ' \
53
+ # '(+), it\'s suspended ($) or it\'s ignored (!), plus the thread ' \
54
+ # 'number and the top stack item. If \'verbose\' is given then the ' \
55
+ # 'entire stack frame is shown.'],
55
56
  ['variables', 1,
56
57
  'Local and instance variables of the current stack frame']
57
58
  ].map do |name, min, short_help, long_help|
@@ -60,11 +61,11 @@ and "sha1".'],
60
61
 
61
62
  InfoFileSubcommands =
62
63
  [
63
- ['all', 1, 'All file information available - breakpoints, lines, mtime,
64
- path and sha1'],
64
+ ['all', 1, 'All file information available - breakpoints, lines, mtime' \
65
+ ', path and sha1'],
65
66
  ['basic', 2, 'basic information - path, number of lines'],
66
- ['breakpoints', 2, 'Show trace line numbers', '
67
- These are the line number where a breakpoint can be set.'],
67
+ ['breakpoints', 2, 'Show trace line numbers',
68
+ 'These are the line number where a breakpoint can be set.'],
68
69
  ['lines', 1, 'Show number of lines in the file'],
69
70
  ['mtime', 1, 'Show modification time of file'],
70
71
  ['path', 4, 'Show full file path name for file'],
@@ -197,7 +198,7 @@ These are the line number where a breakpoint can be set.'],
197
198
  LineCache::cache(file, Command.settings[:reload_source_on_change])
198
199
  end
199
200
 
200
- print "File %s", file
201
+ print "File #{file}"
201
202
  path = LineCache.path(file)
202
203
  if %w(all basic path).member?(subcmd.name) and path != file
203
204
  print " - %s\n", path
@@ -390,7 +391,7 @@ These are the line number where a breakpoint can be set.'],
390
391
  end
391
392
  obj = debug_eval('self')
392
393
  locals = @state.context.frame_locals(@state.frame_pos)
393
- locals['self'] = @state.context.frame_self(@state.frame_pos)
394
+ locals[:self] = @state.context.frame_self(@state.frame_pos)
394
395
  locals.keys.sort.each do |name|
395
396
  next if name =~ /^__dbg_/ # skip byebug pollution
396
397
  ### FIXME: make a common routine
@@ -1,18 +1,19 @@
1
1
  require 'irb'
2
2
 
3
- module IRB # :nodoc:
4
- module ExtendCommand # :nodoc:
5
- class Continue # :nodoc:
3
+ module IRB
4
+
5
+ module ExtendCommand
6
+ class Continue
6
7
  def self.execute(conf)
7
8
  throw :IRB_EXIT, :cont
8
9
  end
9
10
  end
10
- class Next # :nodoc:
11
+ class Next
11
12
  def self.execute(conf)
12
13
  throw :IRB_EXIT, :next
13
14
  end
14
15
  end
15
- class Step # :nodoc:
16
+ class Step
16
17
  def self.execute(conf)
17
18
  throw :IRB_EXIT, :step
18
19
  end
@@ -21,7 +22,7 @@ module IRB # :nodoc:
21
22
  ExtendCommandBundle.def_extend_command "cont", :Continue
22
23
  ExtendCommandBundle.def_extend_command "n", :Next
23
24
  ExtendCommandBundle.def_extend_command "step", :Step
24
-
25
+
25
26
  def self.start_session(binding)
26
27
  unless @__initialized
27
28
  args = ARGV.dup
@@ -30,7 +31,7 @@ module IRB # :nodoc:
30
31
  ARGV.replace(args)
31
32
  @__initialized = true
32
33
  end
33
-
34
+
34
35
  workspace = WorkSpace.new(binding)
35
36
 
36
37
  irb = Irb.new(workspace)
@@ -44,12 +45,13 @@ module IRB # :nodoc:
44
45
  end
45
46
  end
46
47
 
48
+
47
49
  module Byebug
48
50
 
49
- # Implements byebug "irb" command.
51
+ # Implements byebug's "irb" command.
50
52
  class IRBCommand < Command
51
53
 
52
- register_setting_get(:autoirb) do
54
+ register_setting_get(:autoirb) do
53
55
  IRBCommand.always_run
54
56
  end
55
57
  register_setting_set(:autoirb) do |value|
@@ -61,7 +63,7 @@ module Byebug
61
63
  (?:\s+(-d))?
62
64
  \s*$/x
63
65
  end
64
-
66
+
65
67
  def execute
66
68
  unless @state.interface.kind_of?(LocalInterface)
67
69
  print "Command is available only in local mode.\n"
@@ -73,20 +75,20 @@ module Byebug
73
75
  end
74
76
 
75
77
  add_debugging = @match.is_a?(MatchData) && '-d' == @match[1]
76
- $rdebug_state = @state if add_debugging
78
+ $byebug_state = @state if add_debugging
77
79
  $rdebug_in_irb = true
78
80
  cont = IRB.start_session(get_binding)
79
81
  case cont
80
82
  when :cont
81
- @state.proceed
83
+ @state.proceed
82
84
  when :step
83
85
  force = Command.settings[:force_stepping]
84
- @state.context.step(1, force)
85
- @state.proceed
86
+ @state.context.step 1, force
87
+ @state.proceed
86
88
  when :next
87
89
  force = Command.settings[:force_stepping]
88
- @state.context.step_over(1, @state.frame_pos, force)
89
- @state.proceed
90
+ @state.context.step_over 1, @state.frame_pos, force
91
+ @state.proceed
90
92
  else
91
93
  file = @state.context.frame_file(0)
92
94
  line = @state.context.frame_line(0)
@@ -96,10 +98,10 @@ module Byebug
96
98
 
97
99
  ensure
98
100
  $rdebug_in_irb = nil
99
- $rdebug_state = nil if add_debugging
101
+ $byebug_state = nil if add_debugging
100
102
  trap("SIGINT", save_trap) if save_trap
101
103
  end
102
-
104
+
103
105
  class << self
104
106
  def help_command
105
107
  'irb'
@@ -109,10 +111,10 @@ module Byebug
109
111
  %{
110
112
  irb [-d]\tstarts an Interactive Ruby (IRB) session.
111
113
 
112
- If -d is added you can get access to byebug state via the global variable
113
- $RDEBUG_state.
114
+ If -d is added you can get access to byebug's state via the global variable
115
+ $byebug_state.
114
116
 
115
- irb is extended with methods "cont", "n" and "step" which
117
+ irb is extended with methods "cont", "n" and "step" which
116
118
  run the corresponding byebug commands. In contrast to the real byebug
117
119
  commands these commands don't allow command arguments.
118
120
  }
@@ -7,7 +7,7 @@ module Byebug
7
7
  have_methodsig = false
8
8
  end
9
9
 
10
- # Implements the byebug 'method sig' command.
10
+ # Implements byebug's 'method sig' command.
11
11
  class MethodSigCommand < Command
12
12
  def regexp
13
13
  /^\s*m(?:ethod)?\s+sig(?:nature)?\s+(\S+)\s*$/
@@ -39,7 +39,7 @@ module Byebug
39
39
  end
40
40
  end if have_methodsig
41
41
 
42
- # Implements the byebug 'method' command.
42
+ # Implements byebug's 'method' command.
43
43
  class MethodCommand < Command
44
44
  def regexp
45
45
  /^\s*m(?:ethod)?\s+((iv)|(i(:?nstance)?)\s+)?/
@@ -53,14 +53,14 @@ module Byebug
53
53
  end
54
54
  elsif @match[1]
55
55
  obj = debug_eval(@match.post_match)
56
- print "%s\n", columnize(obj.methods.sort(),
56
+ print "%s\n", columnize(obj.methods.sort(),
57
57
  self.class.settings[:width])
58
58
  else
59
59
  obj = debug_eval(@match.post_match)
60
60
  unless obj.kind_of? Module
61
61
  print "Should be Class/Module: %s\n", @match.post_match
62
62
  else
63
- print "%s\n", columnize(obj.instance_methods(false).sort(),
63
+ print "%s\n", columnize(obj.instance_methods(false).sort(),
64
64
  self.class.settings[:width])
65
65
  end
66
66
  end
@@ -1,30 +1,32 @@
1
1
  module Byebug
2
+
2
3
  # Implements byebug "reload" command.
3
4
  class ReloadCommand < Command
4
5
  self.allow_in_control = true
5
6
 
6
- register_setting_get(:reload_source_on_change) do
7
+ register_setting_get(:reload_source_on_change) do
7
8
  Byebug.reload_source_on_change
8
9
  end
10
+
9
11
  register_setting_set(:reload_source_on_change) do |value|
10
12
  Byebug.reload_source_on_change = value
11
13
  end
12
-
14
+
13
15
  def regexp
14
16
  /^\s*r(?:eload)?$/
15
17
  end
16
-
18
+
17
19
  def execute
18
20
  Byebug.source_reload
19
21
  print "Source code is reloaded. Automatic reloading is #{source_reloading}.\n"
20
22
  end
21
-
23
+
22
24
  private
23
-
25
+
24
26
  def source_reloading
25
27
  Byebug.reload_source_on_change ? 'on' : 'off'
26
28
  end
27
-
29
+
28
30
  class << self
29
31
  def help_command
30
32
  'reload'
@@ -1,4 +1,5 @@
1
1
  module Byebug
2
+
2
3
  # Implements byebug "set" command.
3
4
  class SetCommand < Command
4
5
  SubcmdStruct2=Struct.new(:name, :min, :is_bool, :short_help,
@@ -6,33 +7,34 @@ module Byebug
6
7
  Subcommands =
7
8
  [
8
9
  ['annotate', 2, false, "Set annotation level",
9
- "0 == normal
10
- 2 == output annotated suitably for use by programs that control byebug."],
10
+ '0 == normal. ' \
11
+ '2 == output annotated suitably for use by programs that control ' \
12
+ 'byebug.'],
11
13
  ['args', 2, false,
12
- "Set argument list to give program being debugged when it is started",
13
- "Follow this command with any number of args, to be passed to the program."],
14
+ 'Set argument list to give program being debugged when it is started'],
14
15
  ['autoeval', 4, true, "Evaluate every unrecognized command"],
15
16
  ['autolist', 4, true, "Execute 'list' command on every breakpoint"],
16
17
  ['autoirb', 4, true, "Invoke IRB on every stop"],
17
18
  ['autoreload', 4, true, "Reload source code when changed"],
18
19
  ['basename', 1, true, "Report file basename only showing file names"],
19
20
  ['callstyle', 2, false, "Set how you want call parameters displayed"],
20
- ['byebugtesting', 8, false, "Used when testing the byebug"],
21
+ ['byebugtesting', 8, false, "Used when testing byebug"],
21
22
  ['forcestep', 2, true,
22
- "Make sure 'next/step' commands always move to a new line"],
23
+ 'Make sure \'next/step\' commands always move to a new line'],
23
24
  ['fullpath', 2, true, "Display full file names in frames"],
24
25
  ['history', 2, false,
25
- "Generic command for setting command history parameters",
26
- "set history filename -- Set the filename in which to record the command history
27
- set history save -- Set saving of the history record on exit
28
- set history size -- Set the size of the command history"],
26
+ 'Generic command for setting command history parameters',
27
+ 'set history filename -- Set the filename in which to record the ' \
28
+ 'command history. ' \
29
+ 'set history save -- Set saving of the history record on exit. ' \
30
+ 'set history size -- Set the size of the command history'],
29
31
  ['linetrace+', 10, true,
30
- "Set line execution tracing to show different lines"],
32
+ 'Set line execution tracing to show different lines'],
31
33
  ['linetrace', 3, true, "Set line execution tracing"],
32
34
  ['listsize', 3, false, "Set number of source lines to list by default"],
33
35
  ['trace', 1, true, "Display stack trace when 'eval' raises exception"],
34
36
  ['width', 1, false,
35
- "Number of characters the byebug thinks are in a line"]
37
+ 'Number of characters per line for byebug\'s output']
36
38
  ].map do |name, min, is_bool, short_help, long_help|
37
39
  SubcmdStruct2.new(name, min, is_bool, short_help, long_help)
38
40
  end unless defined?(Subcommands)
@@ -96,14 +98,13 @@ set history size -- Set the size of the command history"],
96
98
  if args[0]
97
99
  arg = args[0].downcase.to_sym
98
100
  case arg
99
- when :short, :last
101
+ when :short, :last, :tracked
100
102
  Command.settings[:callstyle] = arg
101
- print "%s\n" % show_setting(try_subcmd.name)
102
- return
103
+ else
104
+ print "Invalid call style #{arg}. Should be one of: " \
105
+ "'short', 'last' or 'tracked'.\n"
103
106
  end
104
107
  end
105
- print "Invalid call style #{arg}. Should be one of: " +
106
- "'short' or 'last'.\n"
107
108
  when /^trace$/
108
109
  Command.settings[:stack_trace_on_error] = set_on
109
110
  when /^fullpath$/
@@ -126,15 +127,18 @@ set history size -- Set the size of the command history"],
126
127
  when /^save$/
127
128
  interface.history_save = get_onoff(args[1])
128
129
  when /^size$/
129
- interface.history_length = get_int(args[1],
130
- "Set history size")
130
+ interface.history_length =
131
+ get_int(args[1], "Set history size")
131
132
  when /^filename$/
132
- interface.histfile = File.join(ENV["HOME"]||ENV["HOMEPATH"]||".", args[1])
133
+ interface.histfile =
134
+ File.join(ENV["HOME"]||ENV["HOMEPATH"]||".", args[1])
133
135
  else
134
- print "Invalid history parameter #{args[0]}. Should be 'filename', 'save' or 'size'.\n"
136
+ print "Invalid history parameter #{args[0]}. Should be " \
137
+ "'filename', 'save' or 'size'.\n"
135
138
  end
136
139
  else
137
- print "Need two parameters for 'set history'; got #{args.size}.\n"
140
+ print "Need two parameters for 'set history'; got " \
141
+ "#{args.size}.\n"
138
142
  return
139
143
  end
140
144
  when /^linetrace\+$/
@@ -160,7 +164,7 @@ set history size -- Set the size of the command history"],
160
164
  print "Unknown setting #{@match[1]}.\n"
161
165
  return
162
166
  end
163
- print "%s\n" % show_setting(try_subcmd.name)
167
+ print "#{show_setting(try_subcmd.name)}\n"
164
168
  return
165
169
  rescue RuntimeError
166
170
  return