Sha256: d6fe3945a39ce9d6028f477ef8ceff60fa1f7444c03711f0722d641806f1944c

Contents?: true

Size: 1.49 KB

Versions: 6

Compression:

Stored size: 1.49 KB

Contents

require 'shellwords'

module Looksee
  class Editor
    def initialize(command)
      @command = command.dup
      infer_arguments
    end

    attr_reader :command

    #
    # Run the editor command for the +method_name+ of +object+.
    #
    def edit(object, method_name)
      method = LookupPath.new(object).find(method_name.to_s) or
        raise NoMethodError, "no method `#{method_name}' in lookup path of #{object.class} instance"
      file, line = method.source_location
      if !file
        raise NoSourceLocationError, "no source location for #{method.owner}##{method.name}"
      elsif !File.exist?(file)
        raise NoSourceFileError, "cannot find source file: #{file}"
      else
        run(file, line)
      end
    end

    #
    # Run the editor command for the given file and line.
    #
    def run(file, line)
      system *command_for(file, line)
    end

    #
    # Return the editor command for the given file and line.
    #
    # This is an array of the command with its arguments.
    #
    def command_for(file, line)
      line = line.to_s
      words = Shellwords.shellwords(command)
      words.map! do |word|
        word.gsub!(/%f/, file)
        word.gsub!(/%l/, line)
        word.gsub!(/%%/, '%')
        word
      end
    end

    private

    def infer_arguments
      return if command =~ /%[fl]/

      case command[/\S+/]
      when /\A(?:g?vim?|.*macs|pico|nano)\z/
        command << " +%l %f"
      when 'mate'
        command << " -l%l %f"
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
looksee-5.0.0 lib/looksee/editor.rb
looksee-4.4.0 lib/looksee/editor.rb
looksee-4.2.0 lib/looksee/editor.rb
looksee-4.1.0 lib/looksee/editor.rb
looksee-4.0.0-universal-java-1.8 lib/looksee/editor.rb
looksee-4.0.0 lib/looksee/editor.rb