:Piggieback

This commit is contained in:
Tim Pope 2014-01-19 17:56:32 -05:00
parent 226c5a0fd1
commit 0095241a6f
3 changed files with 50 additions and 5 deletions

View File

@ -34,7 +34,8 @@ This list isn't exhaustive; see the `:help` for details.
Fireplace.vim talks to nREPL. With Leiningen, it connects automatically based
on `target/repl-port`, otherwise it's just a `:Connect` away. You can connect
to multiple instances of nREPL for different projects, and it will use the
right one automatically.
right one automatically. ClojureScript support is just as seamless with
[Piggieback][].
The only external dependency is that you have either a Vim with Python support
compiled in, or `python` in your path.
@ -45,6 +46,7 @@ your Leiningen or Maven config. It's a bit slow, but a two-second delay is
vastly preferable to being forced out of my flow for a single command, in my
book.
[Piggieback]: https://github.com/cemerick/piggieback
[classpath.vim]: https://github.com/tpope/vim-classpath
### Not quite a REPL

View File

@ -28,6 +28,20 @@ directly, which can be quite slow depending on your setup.
The only adapter shipped with fireplace.vim is for nREPL. You need either
|if_pyth| or the python command in your PATH.
*fireplace-piggieback* *fireplace-clojurescript*
ClojureScript is can be evaled with Piggieback if the appropriate nREPL
middleware is loaded. https://github.com/cemerick/piggieback
*fireplace-:Piggieback*
:Piggieback [{env}] Create a new nREPL session and invoke
cemerick.piggieback/cljs-repl with the given or
default (Rhino) environment. This will also happen
automatically on first eval in a ClojureScript buffer
if not invoked explicitly.
:Piggieback! Terminate the most recently created piggieback
session.
LEININGEN *fireplace-leiningen*
In addition to automatic repl connection, Clojure buffers in a Leiningen

View File

@ -190,6 +190,29 @@ endfunction
let s:piggieback = copy(s:repl)
function! s:repl.piggieback(arg, ...) abort
if a:0 && a:1
if len(self.piggiebacks)
call remove(self.piggiebacks, 0)
endif
return {}
endif
if empty(a:arg)
let arg = ''
else
let arg = ' :repl-env ' . a:arg
endif
let connection = s:conn_try(self.connection, 'clone')
let response = connection.eval('(cemerick.piggieback/cljs-repl'.arg.')')
if empty(get(response, 'ex'))
call insert(self.piggiebacks, extend({'connection': connection}, deepcopy(s:piggieback)))
return {}
endif
call connection.close()
return response
endfunction
function! s:piggieback.user_ns() abort
return 'cljs.user'
endfunction
@ -294,9 +317,15 @@ function! s:Connect(...) abort
return ''
endfunction
function! s:piggieback(arg, remove) abort
let response = fireplace#platform().piggieback(a:arg, a:remove)
call s:output_response(response)
endfunction
augroup fireplace_connect
autocmd!
autocmd FileType clojure command! -bar -complete=customlist,s:connect_complete -nargs=* Connect :FireplaceConnect <args>
autocmd FileType clojure command! -bar -complete=customlist,fireplace#eval_complete -bang -nargs=* Piggieback :call s:piggieback(<q-args>, <bang>0)
augroup END
" }}}1
@ -367,10 +396,12 @@ function! s:oneoff.eval(expr, options) dict abort
return s:spawning_eval(self.classpath, a:expr, get(a:options, 'ns', self.user_ns()))
endfunction
function! s:oneoff.message(symbol) abort
function! s:oneoff.message(...) abort
throw 'No live REPL connection'
endfunction
let s:oneoff.piggieback = s:oneoff.message
" }}}1
" Client {{{1
@ -439,12 +470,10 @@ function! fireplace#client(...) abort
throw ':Connect to a REPL to evaluate code'
endif
if empty(client.piggiebacks)
let connection = s:conn_try(client.connection, 'clone')
let result = connection.eval('(cemerick.piggieback/cljs-repl)')
let result = client.piggieback('')
if has_key(result, 'ex')
return result
endif
call insert(client.piggiebacks, extend({'connection': connection}, deepcopy(s:piggieback)))
endif
return client.piggiebacks[0]
endif