# class Byebug::Command

Parent class of all byebug commands.

Subclasses need to implement a `regexp` and an `execute` command.

### Constants

Subcmd

### Attributes

allow_in_control[RW]
allow_in_post_mortem[W]
always_run[W]

### Public Class Methods

new(state) click to toggle source

    # File lib/byebug/command.rb, line 19
    def initialize(state)
      @match, @state = nil, state
    end

### Protected Class Methods

allow_in_post_mortem() click to toggle source

    # File lib/byebug/command.rb, line 73
    def allow_in_post_mortem
      !defined?(@allow_in_post_mortem) ? true : false
    end

always_run() click to toggle source

    # File lib/byebug/command.rb, line 77
    def always_run
      @always_run ||= 0
    end

commands() click to toggle source

    # File lib/byebug/command.rb, line 118
    def commands
      @commands ||= []
    end

find(subcmds, str) click to toggle source

    # File lib/byebug/command.rb, line 89
    def find(subcmds, str)
      str.downcase!
      subcmds.each do |subcmd|
        if (str.size >= subcmd.min) && (subcmd.name[0..str.size - 1] == str)
          return subcmd
        end
      end

      nil
    end

format_subcmd(subcmd_name) click to toggle source

    # File lib/byebug/command.rb, line 100
    def format_subcmd(subcmd_name)
      subcmd = find(self::Subcommands, subcmd_name)
      return "Invalid \"#{names.join('|')}\" "                 "subcommand \"#{args[1]}\"." unless subcmd

      "\n  #{subcmd.help}.\n\n"
    end

format_subcmds() click to toggle source

    # File lib/byebug/command.rb, line 108
    def format_subcmds
      header = names.join('|')
      s = "  List of \"#{header}\" subcommands:\n  --\n"
      w = self::Subcommands.map(&:name).max_by(&:size).size
      self::Subcommands.each do |subcmd|
        s += format("  %s %-#{w}s -- %s\n", header, subcmd.name, subcmd.help)
      end
      s + "\n"
    end

help(subcmd = nil) click to toggle source

    # File lib/byebug/command.rb, line 81
    def help(subcmd = nil)
      return format_subcmd(subcmd) if subcmd

      output = description
      output += format_subcmds if defined? self::Subcommands
      output
    end

inherited(klass) click to toggle source

    # File lib/byebug/command.rb, line 122
    def inherited(klass)
      commands << klass
    end

### Public Instance Methods

match(input) click to toggle source

    # File lib/byebug/command.rb, line 23
    def match(input)
      @match = regexp.match(input)
    end

### Protected Instance Methods

bb_eval(str, b = get_binding) click to toggle source

Evaluates a string containing Ruby code, using binding `b`. In case of error full stack trace and error are printed.

    # File lib/byebug/command.rb, line 39
    def bb_eval(str, b = get_binding)
      b.eval(str)
    rescue StandardError, ScriptError => e
      at = e.backtrace
      locations = []
      locations << "#{at.shift}: #{e.class} Exception(#{e.message})"
      locations += at.map { |path| "\tfrom #{path}" }

      errmsg(pr('eval.exception', text_message: locations.join("\n")))
      nil
    end

bb_warning_eval(str, b = get_binding) click to toggle source

Evaluates a string containing Ruby code, using binding `b`. In case of error, an error message with the exception is printed.

    # File lib/byebug/command.rb, line 55
    def bb_warning_eval(str, b = get_binding)
      b.eval(str)
    rescue StandardError, ScriptError => e
      text_message = "#{e.class} Exception: #{e.message}"
      errmsg(pr('eval.exception', text_message: text_message))
      nil
    end

get_binding(pos = @state.frame) click to toggle source

    # File lib/byebug/command.rb, line 63
    def get_binding(pos = @state.frame)
      @state.context ? @state.context.frame_binding(pos) : TOPLEVEL_BINDING
    end