class Zoom::Editor

Public Class Methods

new(editor) click to toggle source
# File lib/zoom/editor.rb, line 45
def initialize(editor)
    @editor, _, @flags = editor.partition(" ") if (editor)
    if (editor.nil?)
        @editor = ENV["EDITOR"] || "vim"
        @editor= "vi" if (ScoobyDoo.where_are_you(@editor).nil?)
        @flags = ""
    end

    # In case of vim server functionality
    @vimserver = ""
    @flags.match(/--servername\s+["']?([^"' ]+)/) do |m|
        @vimserver = m[1]
    end

    # In case of vim remote functionality
    if (!@vimserver.empty?)
        @flags.match(/(--remote(-tab)?(-wait)?(-silent)?)/) do |m|
            @flags.gsub!(/#{m[1]}/, "")
        end
    end
end

Public Instance Methods

open(results) click to toggle source
# File lib/zoom/editor.rb, line 67
def open(results)
    return if (results.nil? || results.empty?)

    case @editor
    when /vim$/
        vim(results)
    else
        default(results)
    end
end
vim(results) click to toggle source
# File lib/zoom/editor.rb, line 98
def vim(results)
    already_started = vim_remote_started?

    quickfix = Pathname.new("~/.cache/zoom/quickfix").expand_path
    source = Pathname.new("~/.cache/zoom/source").expand_path
    FileUtils.mkdir_p(quickfix.dirname)

    zq = File.open(quickfix, "w")
    zs = File.open(source, "w")

    vimscript = [
        "augroup Zoom",
        "  autocmd!",
        "  autocmd FileType qf nnoremap <cr> :.cc<cr>:cclose<cr>",
        "augroup END",
        "",
        "nnoremap <leader>z :copen<cr>",
        "nnoremap zn :cn<cr>",
        "nnoremap zp :cp<cr>",
        ""
    ].join("\n")
    zs.write(vimscript) if (!already_started)

    files = Array.new
    results.each do |result|
        if (result.grep_like?)
            if (result.filename.start_with?("/"))
                filename = result.filename
            else
                filename = result.pwd + "/" + result.filename
            end
        else
            if (result.contents.start_with?("/"))
                filename = result.contents
            else
                filename = result.pwd + "/" + result.contents
            end
        end

        lineno = result.lineno
        match = result.match

        if (!files.include?(filename))
            files.push(filename)
            zs.write("edit! #{filename}\n")
            zs.write("#{lineno}\nbnext\n") if (result.grep_like?)
        end

        if (result.grep_like?)
            zq.write("#{filename}:#{lineno}: #{match}\n")
        end
    end

    if (!already_started)
        zs.write("silent cfile #{quickfix}\n")
    else
        results.each do |result|
            zs.write("bprev\n") if (result.grep_like?)
        end
        zs.write("silent caddf #{quickfix}\n")
    end

    zq.close
    zs.close

    if (!already_started)
        system("#{@editor} -c \"source #{source}\" #{@flags}")
        FileUtils.rm_f(quickfix)
        FileUtils.rm_f(source)
    else
        system(
            [
                @editor,
                @flags,
                "--remote-send \":source #{source}\n\""
            ].join(" ")
        )
    end
end

Private Instance Methods

default(results) click to toggle source
# File lib/zoom/editor.rb, line 6
def default(results)
    # First result should never be nil, but better safe than sorry
    first_result = results.delete_at(0)
    open_result(first_result) if (first_result)

    results.each do |result|
        print "Open result #{result.tag} [y]/n/q/l?: "
        answer = nil
        while (answer.nil?)
            begin
                system("stty raw -echo")
                if ($stdin.ready?)
                    answer = $stdin.getc
                else
                    sleep 0.1
                end
            ensure
                system("stty -raw echo")
            end
        end
        puts

        case answer
        when "n", "N"
            # Do nothing
        when "l", "L"
            # Open this result then exit
            open_result(result)
            break
        when "q", "Q", "\x03"
            # Quit or ^C
            break
        else
            open_result(result)
        end
    end
end
open_result(result) click to toggle source
# File lib/zoom/editor.rb, line 78
def open_result(result)
    if (result.grep_like?)
        if (result.filename.start_with?("/"))
            filename = result.filename
        else
            filename = result.pwd + "/" + result.filename
        end
        lineno = result.lineno
        system("#{@editor} #{@flags} +#{lineno} '#{filename}'")
    else
        if (result.contents.start_with?("/"))
            filename = result.contents
        else
            filename = result.pwd + "/" + result.contents
        end
        system("#{@editor} #{@flags} '#{filename}'")
    end
end
vim_remote_started?() click to toggle source
# File lib/zoom/editor.rb, line 178
def vim_remote_started?
    return false if (@vimserver.empty?)
    %x(#{@editor} --serverlist).downcase.match(
        /^#{@vimserver}$/
    ) do
        return true
    end
    return false
end