vim/bundle/ooze/plugin/ooze.vim @ 8a1376b77b80

its a bird its a plane no its just a plane actually
author Steve Losh <steve@stevelosh.com>
date Thu, 21 Jan 2016 15:50:58 +0000
parents 83aac563abc9
children b69dc77f379c
" vim: set foldmethod=indent
" TODO: 
" Unfuck folding
" Disassembly mapping
" in-package horseshit
" error handling
" multi-packet messages
"

function! s:IsString(a)
    return type(a:a) == 1
endfunction

function! s:GetString(msg, key, extra)
    let val = get(a:msg, a:key)
    if s:IsString(val)
        return val . a:extra
    else
        return ''
    endif
endfunction

let g:ooze_scratch_buffer_name = '__OozeScratch__'
function! s:OpenOozeScratch(contents)
    echom "test"
    echom bufname('%')
    if bufname('%') != g:ooze_scratch_buffer_name
        wincmd s
        execute "edit " . g:ooze_scratch_buffer_name
    endif

    set filetype=lisp
    setlocal foldlevel=99
    setlocal buftype=nofile
    setlocal bufhidden=hide
    setlocal noswapfile
    setlocal buflisted

    setlocal noreadonly
    normal! ggdG
    call append(0, a:contents)
    setlocal readonly
endfunction

function! s:HandleMessage(msg)
    let moutput = s:GetString(a:msg, 'macroexpand-1', "")
    if moutput != ''
        call s:OpenOozeScratch(split(moutput, "\n"))
        return
    endif

    let output = ''
    let output .= s:GetString(a:msg, 'stdout', "")
    let output .= s:GetString(a:msg, 'stdout', "")
    let output .= s:GetString(a:msg, 'stderr', "")
    let output .= s:GetString(a:msg, 'value', "")

    let output .= s:GetString(a:msg, 'error', "\n\n")
    let output .= s:GetString(a:msg, 'original', "\n\n")
    let output .= s:GetString(a:msg, 'backtrace', "\n")

    let output .= s:GetString(a:msg, 'function-arglist', "\n\n")
    let output .= s:GetString(a:msg, 'function-docstring', "\n")
    if output != ''
        echo output
    endif
endfunction

function! s:HandleData(data)
    for msg in bencode#BdecodeAll(a:data)
        call s:HandleMessage(msg)
    endfor
endfunction

silent! function s:JobHandler(job_id, data, event)
    if a:event == 'stdout'
        call s:HandleData(join(a:data, "\n"))
    elseif a:event == 'stderr'
        1
    else
        1
    endif
endfunction

let s:callbacks = {
\ 'on_stdout': function('s:JobHandler'),
\ 'on_stderr': function('s:JobHandler'),
\ 'on_exit': function('s:JobHandler')
\ }

if !exists("g:ooze_connection")
    let g:ooze_connection = 0
endif

function! OozeDisconnect()
    if g:ooze_connection
        call jobstop(g:ooze_connection)
        let g:ooze_connection = 0
    endif
endfunction

function! OozeConnect()
    if g:ooze_connection
        call OozeDisconnect()
    endif
    let g:ooze_connection = jobstart(['nc', 'localhost', '8675'], s:callbacks)
endfunction

function! OozeMacroexpand(form)
    if !g:ooze_connection
        throw "Not connected!"
    endif
    let msg = {"op": "macroexpand", "form": a:form}
    call jobsend(g:ooze_connection, bencode#Bencode(msg))
endfunction

function! OozeMacroexpandSelection()
    let z = @z
    normal! gv"zy
    call OozeMacroexpand(@z)
    let @z = z
endfunction

function! OozeDocument(symbol)
    if !g:ooze_connection
        throw "Not connected!"
    endif
    let msg = {"op": "documentation", "symbol": a:symbol}
    call jobsend(g:ooze_connection, bencode#Bencode(msg))
endfunction

function! OozeDocumentSelection()
    let z = @z
    normal! gv"zy
    call OozeDocument(@z)
    let @z = z
endfunction

function! OozeEval(code)
    if !g:ooze_connection
        throw "Not connected!"
    endif
    let msg = {"op": "eval", "code": a:code}
    call jobsend(g:ooze_connection, bencode#Bencode(msg))
endfunction

function! OozeEvalSelection()
    let z = @z
    normal! gv"zy
    call OozeEval(@z)
    let @z = z
endfunction

function! OozeLoad(path)
    if !g:ooze_connection
        throw "Not connected!"
    endif
    let msg = {"op": "load-file", "path": a:path}
    call jobsend(g:ooze_connection, bencode#Bencode(msg))
endfunction

function! OozeLoadCurrent()
    call OozeLoad(expand('%:p'))
endfunction

function! OozeMapKeys()
    nnoremap <buffer> <localleader>C :call OozeConnect()<cr>
    nnoremap <buffer> <localleader>K :call OozeDisconnect()<cr>

    nnoremap <buffer> <localleader>E :call OozeEval(input("? "))<cr>
    vnoremap <buffer> <localleader>e :<c-u>call OozeEvalSelection()<cr>
    nnoremap <buffer> <localleader>e mz:silent normal! l<cr>:call PareditFindDefunBck()<cr>vab:<c-u>call OozeEvalSelection()<cr>`z
    nnoremap <buffer> <localleader>f mzvab:<c-u>call OozeEvalSelection()<cr>`z

    nnoremap <buffer> <localleader>D :call OozeDocument(input("? "))<cr>
    " nnoremap <buffer> <localleader>d mzviw:<c-u>call OozeDocumentSelection()<cr>`z
    inoremap <buffer> <silent> <c-d> <esc>mzbviw:<c-u>call OozeDocumentSelection()<cr>`za
    nnoremap <buffer> M mzviw:<c-u>call OozeDocumentSelection()<cr>`z

    nnoremap <buffer> <localleader>M :call OozeMacroexpand(input("? "))<cr>
    nnoremap <buffer> <localleader>m mzvab:<c-u>call OozeMacroexpandSelection()<cr>`z

    nnoremap <buffer> <localleader>r :call OozeLoadCurrent()<cr>
endfunction

augroup ooze_dev
    au!
    autocmd BufWritePost ooze.vim source %
augroup END