require 'socket' class VimRubyDebugger def initialize(params) @params = params create_directory(@params[:messages_file]) @rdebug = wait_for_opened_socket(@params[:host], @params[:rdebug_port]) @vim_ruby_debugger = TCPServer.new(@params[:host], @params[:vim_ruby_debugger_port]) @queue = [] @result = [] @separator = "++vim-ruby-debugger separator++" run end private def wait_for_opened_socket(host, port, &block) attempts = 0 begin socket = TCPSocket.open(host, port) yield if block_given? rescue Errno::ECONNREFUSED => msg attempts += 1 # If socket wasn't be opened for 20 seconds, exit if attempts < 400 sleep 0.05 retry else raise Errno::ECONNREFUSED, "#{host}:#{port} wasn't be opened" end end socket end def create_directory(file) dir = File.dirname(file) Dir.mkdir(dir) unless File.exist?(dir) && File.directory?(dir) end def run t1 = Thread.new do while(session = @vim_ruby_debugger.accept) input = session.gets @queue = input.split(@separator) handle_queue end end t2 = Thread.new do loop do response = select([@rdebug], nil, nil) output = read_socket(response, @rdebug) @result << output # If we stop at breakpoint, add taking of local variables into queue stop_commands = [ '" : "") system("#{@params[:vim_executable]} --servername #{@params[:vim_servername]} -u NONE -U NONE --remote-send \"#{starter}#{command}\""); end end def have_unclosed_tag?(output) start_match = output.match(/^<([a-zA-Z0-9\-_]+)>/) if start_match end_match = output.match(/<\/#{start_match[1]}>$/) return end_match ? false : true else return false end end end VimRubyDebugger.new( :host => ARGV[0], :rdebug_port => ARGV[1], :vim_ruby_debugger_port => ARGV[2], :vim_executable => ARGV[3], :vim_servername => ARGV[4], :messages_file => ARGV[5], :os => ARGV[6] )