author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 01 Dec 2015 12:35:31 +0000 |
parents |
(none) |
children |
e7642253ffde |
" janky workaround from https://github.com/hylang/vim-hy/blob/master/after/plugin/fireplace.vim
augroup fireplace_connect
autocmd FileType lisp command! -buffer -bar -nargs=*
\ Connect FireplaceConnect <args>
augroup END
function! s:set_up_eval() abort
command! -buffer -bang -range=0 -nargs=? Eval :exe s:Eval(<bang>0, <line1>, <line2>, <count>, <q-args>)
command! -buffer -bar -nargs=1 -complete=customlist,fireplace#eval_complete Doc :exe s:Doc(<q-args>)
nmap <buffer> cp <Plug>FireplacePrint
nmap <buffer> cpp <Plug>FireplaceCountPrint
nmap <buffer> cm <Plug>FireplaceMacroExpand
nmap <buffer> cmm <Plug>FireplaceCountMacroExpand
nmap <buffer> cqp <Plug>FireplacePrompt
map! <buffer> <C-R>( <Plug>FireplaceRecall
nmap <buffer> K <Plug>FireplaceK
endfunction
if !exists('s:qffiles')
let s:qffiles = {}
endif
function! s:buf() abort
if exists('s:input')
return s:input
elseif has_key(s:qffiles, expand('%:p'))
return s:qffiles[expand('%:p')].buffer
else
return '%'
endif
endfunction
function! s:buffer_path(...) abort
let buffer = a:0 ? a:1 : s:buf()
if getbufvar(buffer, '&buftype') =~# '^no'
return ''
endif
let path = substitute(fnamemodify(bufname(buffer), ':p'), '\C^zipfile:\(.*\)::', '\1/', '')
for dir in fireplace#path(buffer)
if dir !=# '' && path[0 : strlen(dir)-1] ==# dir && path[strlen(dir)] =~# '[\/]'
return path[strlen(dir)+1:-1]
endif
endfor
return ''
endfunction
function! s:Eval(bang, line1, line2, count, args) abort
let options = {}
if a:args !=# ''
let expr = a:args
else
if a:count ==# 0
let open = '[[{(]'
let close = '[]})]'
let [line1, col1] = searchpairpos(open, '', close, 'bcrn', g:fireplace#skip)
let [line2, col2] = searchpairpos(open, '', close, 'rn', g:fireplace#skip)
if !line1 && !line2
let [line1, col1] = searchpairpos(open, '', close, 'brn', g:fireplace#skip)
let [line2, col2] = searchpairpos(open, '', close, 'crn', g:fireplace#skip)
endif
while col1 > 1 && getline(line1)[col1-2] =~# '[#''`~@]'
let col1 -= 1
endwhile
else
let line1 = a:line1
let line2 = a:line2
let col1 = 1
let col2 = strlen(getline(line2))
endif
if !line1 || !line2
return ''
endif
let options.file_path = s:buffer_path()
let expr = repeat("\n", line1-1).repeat(" ", col1-1)
if line1 == line2
let expr .= getline(line1)[col1-1 : col2-1]
else
let expr .= getline(line1)[col1-1 : -1] . "\n"
\ . join(map(getline(line1+1, line2-1), 'v:val . "\n"'))
\ . getline(line2)[0 : col2-1]
endif
if a:bang
exe line1.','.line2.'delete _'
endif
endif
if a:bang
try
let result = fireplace#session_eval(expr, options)
if a:args !=# ''
call append(a:line1, result)
exe a:line1
else
call append(a:line1-1, result)
exe a:line1-1
endif
catch /^Clojure:/
endtry
else
call fireplace#echo_session_eval(expr, options)
endif
return ''
endfunction
augroup fireplace_bindings
autocmd FileType lisp call s:set_up_eval()
augroup END
function! s:Doc(symbol) abort
let info = fireplace#info(a:symbol)
if has_key(info, 'ns') && has_key(info, 'name')
echo info.ns . ' ' . info.name
elseif has_key(info, "name")
echo info.name
endif
if get(info, 'arglists-str', 'nil') !=# 'nil'
echo info['arglists-str']
endif
if !empty(get(info, 'doc', ''))
echo "\n" . info.doc
endif
return ''
endfunction
function! s:K() abort
let word = expand('<cword>')
return 'Doc '.word
endfunction