This adds a couple commands for manipulating clojure (leiningen) repls:
:LeinRepl Starts a new repl; does not check if one is already running :LeinReplClose Close any (and all) existing repls :LeinReplRestart Convenience to close all repls and start up a new one
I have this in my ftplugin/clojure.vim
python << EOF
import os, platform, subprocess, vim
try:
# only define once, please
clj_repl_procs
except:
clj_repl_procs = []
def open_repl():
win = platform.system() == "Windows"
env = None
if platform.system() == "Darwin":
env = os.environ.copy()
env["PATH"] += ":/usr/local/bin"
dir = os.path.dirname(vim.current.buffer.name)
proc = subprocess.Popen(['lein', 'repl'],
env=env, cwd=dir,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, shell=win)
clj_repl_procs.append(proc)
line = proc.stdout.readline()
if not line:
print "Error"
else:
# re-open the file to auto-connect
# do like this to suppress the "return to continue"
# and make it look fancy
vim.command('e | redraw | echohl IncSearch | echo "Repl Started" | echohl None')
def close_all_repl():
for proc in clj_repl_procs:
proc.stdin.close()
proc.kill()
def restart_repl():
vim.command('redraw | echo "Closing Repl..."')
close_all_repl()
vim.command('redraw | echo "Restaring Repl..."')
open_repl()
EOF
command! LeinRepl py open_repl()
function! LeinReplCloseFunc()
py close_all_repl()
endfunction
command! LeinReplClose call LeinReplCloseFunc()
command! LeinReplRestart py restart_repl()
augroup LeinShutDownGroup
autocmd VimLeavePre * call LeinReplCloseFunc()
augroup END