Sha256: 42982f06dd6190154d7af2599b06304e275cb90b125f17f6232f0792e99bfcc3

Contents?: true

Size: 1.6 KB

Versions: 3

Compression:

Stored size: 1.6 KB

Contents

# This hooks into standard error to open backtraces in vim
class StandardError
  alias _backtrace backtrace
  def message_is_filtered?
    matches = message_filters.detect do |message_filter|
      [self.class, message].join(": ").match message_filter
    end
    puts "#{message} Matched #{matches.inspect}" if matches
    matches ? true : false
  end

  def backtrace
    old = _backtrace
    @old_backtrace ||= nil
    if old.kind_of?(Array) and @old_backtrace.nil?
      open_vims(old) unless message_is_filtered?
      @old_backtrace = true
    end
    old
  end

  def open_vims(lines)
    good_lines = lines.select { |l| l.match(/^[.\/\w][^:\s]*:\d+(?::.*)?$/) }.map do |line|
      next if backtrace_filters.detect { |n| line.match n }
      file, line_number, rest = line.split(":")
      [file, line_number]
    end.compact.uniq
    return if good_lines.size == 0
    file, line = good_lines.shift
    if file.match("->")
      window = file.split("->")[1]
      %x{screen -X select #{window}}
      %x{screen -p #{window} -X stuff ":#{line}\n"}
      return
    end
    s = "screen vim -p"
    s << " +#{line} #{file}"
    # for handling multiple levels back, disabled for now
=begin
    good_lines.each do |l|
      file, line = l
      s << " -c tabnext -c #{line} #{file} "
    end
    s << " -c tabnext " if good_lines.size > 0
=end
    %x{screen -X #{s}}
  end

  # Don't run the backtrace file opener if the exception matches this
  def backtrace_filters
    [
      "rubygems.rb:\d+:in `activate",
      "/irb/workspace.rb"
    ]
  end

  def message_filters
    [
      "Gem::Exception: can't activate"
    ]
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ride-0.4.3 lib/std_err_hooks.rb
ride-0.4.8 lib/std_err_hooks.rb
ride-0.4.2 lib/std_err_hooks.rb