##// END OF EJS Templates
Improvements to Vim support for visual mode....
Improvements to Vim support for visual mode. Patch by Sebastian Busch. Note: this patch was originally for the 0.10 series, I (fperez) minimally fixed it for 0.11 but it may still require some tweaking to work well with the refactored codebase. Closes https://bugs.launchpad.net/ipython/+bug/460359

File last commit:

r2576:8323fa34
r2576:8323fa34
Show More
ipy.vim
143 lines | 4.5 KiB | text/x-vim | VimLexer
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! <SID>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 <silent> <F5> :python run_this_file()<CR>
map <silent> <S-F5> :python run_this_line()<CR>
map <silent> <F9> :python run_these_lines()<CR>
map <silent> <S-F9> :python toggle_reselect()<CR>
map <silent> <C-F6> :python send('%pdb')<CR>
map <silent> <F6> :python set_breakpoint()<CR>
map <silent> <s-F6> :python clear_breakpoint()<CR>
map <silent> <F7> :python run_this_file_pdb()<CR>
map <silent> <s-F7> :python clear_all_breaks()<CR>
imap <C-F5> <ESC><F5>a
imap <S-F5> <ESC><S-F5>a
imap <silent> <F5> <ESC><F5>a
map <C-F5> :call <SID>toggle_send_on_save()<CR>
py connect()