if !exists("$IPY_SESSION") finish endif " set up the python interpreter within vim, to have all the right modules " imported, as well as certain useful globals set python import socket python import os python import vim python from IPython.core.debugger import Pdb python IPYSERVER = None python reselect = True python << EOF # do we have a connection to the ipython instance? def check_server(): global IPYSERVER if IPYSERVER: return True else: return False # connect to the ipython server, if we need to def connect(): global IPYSERVER if check_server(): return try: IPYSERVER = socket.socket(socket.AF_UNIX) IPYSERVER.connect(os.environ.get('IPY_SERVER')) except: IPYSERVER = None def disconnect(): if IPYSERVER: IPYSERVER.close() def send(cmd): x = 0 while True: x += IPYSERVER.send(cmd) if x < len(cmd): cmd = cmd[x:] else: break def run_this_file(): if check_server(): send('run %s' % (vim.current.buffer.name,)) else: raise Exception, "Not connected to an IPython server" print "\'run %s\' sent to ipython" % vim.current.buffer.name def run_this_line(): if check_server(): send(vim.current.line) print "line \'%s\' sent to ipython"% vim.current.line else: raise Exception, "Not connected to an IPython server" def run_these_lines(): r = vim.current.range if check_server(): #send(str((vim.current.range.start,vim.current.range.end))) for l in vim.current.buffer[r.start:r.end+1]: send(str(l)+'\n') #send(str(vim.current.buffer[vim.current.range.start:vim.current.range.end]).join("\n")) #print "lines %d-%d sent to ipython"% (r.start,r.end) else: raise Exception, "Not connected to an IPython server" #reselect the previously highlighted block if reselect: vim.command("normal gv") #vim lines start with 1 print "lines %d-%d sent to ipython"% (r.start+1,r.end+1) def toggle_reselect(): global reselect reselect=not reselect print "F9 will%sreselect lines after sending to ipython"% (reselect and " " or " not ") def set_breakpoint(): if check_server(): send("__IP.InteractiveTB.pdb.set_break('%s',%d)" % (vim.current.buffer.name, vim.current.window.cursor[0])) print "set breakpoint in %s:%d"% (vim.current.buffer.name, vim.current.window.cursor[0]) else: raise Exception, "Not connected to an IPython server" def clear_breakpoint(): if check_server(): send("__IP.InteractiveTB.pdb.clear_break('%s',%d)" % (vim.current.buffer.name, vim.current.window.cursor[0])) print "clearing breakpoint in %s:%d" % (vim.current.buffer.name, vim.current.window.cursor[0]) else: raise Exception, "Not connected to an IPython server" def clear_all_breakpoints(): if check_server(): send("__IP.InteractiveTB.pdb.clear_all_breaks()"); print "clearing all breakpoints" else: raise Exception, "Not connected to an IPython server" def run_this_file_pdb(): if check_server(): send(' __IP.InteractiveTB.pdb.run(\'execfile("%s")\')' % (vim.current.buffer.name,)) else: raise Exception, "Not connected to an IPython server" print "\'run %s\' using pdb sent to ipython" % vim.current.buffer.name #XXX: have IPYSERVER print the prompt (look at Leo example) EOF fun! toggle_send_on_save() if exists("s:ssos") && s:ssos == 1 let s:ssos = 0 au! BufWritePost *.py :py run_this_file() echo "Autosend Off" else let s:ssos = 1 au BufWritePost *.py :py run_this_file() echo "Autowsend On" endif endfun map :python run_this_file() map :python run_this_line() map :python run_these_lines() map :python toggle_reselect() map :python send('%pdb') map :python set_breakpoint() map :python clear_breakpoint() map :python run_this_file_pdb() map :python clear_all_breaks() imap a imap a imap a map :call toggle_send_on_save() py connect()