diff options
Diffstat (limited to 'ftplugin')
-rw-r--r-- | ftplugin/idris.vim | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/ftplugin/idris.vim b/ftplugin/idris.vim new file mode 100644 index 00000000..ce18060d --- /dev/null +++ b/ftplugin/idris.vim @@ -0,0 +1,346 @@ +if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'idris') != -1 + finish +endif + +if bufname('%') == "idris-response" + finish +endif + +if exists("b:did_ftplugin") + finish +endif + +setlocal shiftwidth=2 +setlocal tabstop=2 +if !exists("g:idris_allow_tabchar") || g:idris_allow_tabchar == 0 + setlocal expandtab +endif +setlocal comments=s1:{-,mb:-,ex:-},:\|\|\|,:-- +setlocal commentstring=--%s +setlocal iskeyword+=? +setlocal wildignore+=*.ibc + +let idris_response = 0 +let b:did_ftplugin = 1 + +" Text near cursor position that needs to be passed to a command. +" Refinment of `expand(<cword>)` to accomodate differences between +" a (n)vim word and what Idris requires. +function! s:currentQueryObject() + let word = expand("<cword>") + if word =~ '^?' + " Cut off '?' that introduces a hole identifier. + let word = strpart(word, 1) + endif + return word +endfunction + +function! s:IdrisCommand(...) + let idriscmd = shellescape(join(a:000)) + return system("idris --client " . idriscmd) +endfunction + +function! IdrisDocFold(lineNum) + let line = getline(a:lineNum) + + if line =~ "^\s*|||" + return "1" + endif + + return "0" +endfunction + +function! IdrisFold(lineNum) + return IdrisDocFold(a:lineNum) +endfunction + +setlocal foldmethod=expr +setlocal foldexpr=IdrisFold(v:lnum) + +function! IdrisResponseWin() + if (!bufexists("idris-response")) + botright 10split + badd idris-response + b idris-response + let g:idris_respwin = "active" + set buftype=nofile + wincmd k + elseif (bufexists("idris-response") && g:idris_respwin == "hidden") + botright 10split + b idris-response + let g:idris_respwin = "active" + wincmd k + endif +endfunction + +function! IdrisHideResponseWin() + let g:idris_respwin = "hidden" +endfunction + +function! IdrisShowResponseWin() + let g:idris_respwin = "active" +endfunction + +function! IWrite(str) + if (bufexists("idris-response")) + let save_cursor = getcurpos() + b idris-response + %delete + let resp = split(a:str, '\n') + call append(1, resp) + b # + call setpos('.', save_cursor) + else + echo a:str + endif +endfunction + +function! IdrisReload(q) + w + let file = expand("%:p") + let tc = s:IdrisCommand(":l", file) + if (! (tc is "")) + call IWrite(tc) + else + if (a:q==0) + echo "Successfully reloaded " . file + call IWrite("") + endif + endif + return tc +endfunction + +function! IdrisReloadToLine(cline) + return IdrisReload(1) + "w + "let file = expand("%:p") + "let tc = s:IdrisCommand(":lto", a:cline, file) + "if (! (tc is "")) + " call IWrite(tc) + "endif + "return tc +endfunction + +function! IdrisShowType() + w + let word = s:currentQueryObject() + let cline = line(".") + let tc = IdrisReloadToLine(cline) + if (! (tc is "")) + echo tc + else + let ty = s:IdrisCommand(":t", word) + call IWrite(ty) + endif + return tc +endfunction + +function! IdrisShowDoc() + w + let word = expand("<cword>") + let ty = s:IdrisCommand(":doc", word) + call IWrite(ty) +endfunction + +function! IdrisProofSearch(hint) + let view = winsaveview() + w + let cline = line(".") + let word = s:currentQueryObject() + let tc = IdrisReload(1) + + if (a:hint==0) + let hints = "" + else + let hints = input ("Hints: ") + endif + + if (tc is "") + let result = s:IdrisCommand(":ps!", cline, word, hints) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + endif + endif +endfunction + +function! IdrisMakeLemma() + let view = winsaveview() + w + let cline = line(".") + let word = s:currentQueryObject() + let tc = IdrisReload(1) + + if (tc is "") + let result = s:IdrisCommand(":ml!", cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + call search(word, "b") + endif + endif +endfunction + +function! IdrisRefine() + let view = winsaveview() + w + let cline = line(".") + let word = expand("<cword>") + let tc = IdrisReload(1) + + let name = input ("Name: ") + + if (tc is "") + let result = s:IdrisCommand(":ref!", cline, word, name) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + endif + endif +endfunction + +function! IdrisAddMissing() + let view = winsaveview() + w + let cline = line(".") + let word = expand("<cword>") + let tc = IdrisReload(1) + + if (tc is "") + let result = s:IdrisCommand(":am!", cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + endif + endif +endfunction + +function! IdrisCaseSplit() + let view = winsaveview() + let cline = line(".") + let word = expand("<cword>") + let tc = IdrisReloadToLine(cline) + + if (tc is "") + let result = s:IdrisCommand(":cs!", cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + endif + endif +endfunction + +function! IdrisMakeWith() + let view = winsaveview() + w + let cline = line(".") + let word = s:currentQueryObject() + let tc = IdrisReload(1) + + if (tc is "") + let result = s:IdrisCommand(":mw!", cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + call search("_") + endif + endif +endfunction + +function! IdrisMakeCase() + let view = winsaveview() + w + let cline = line(".") + let word = s:currentQueryObject() + let tc = IdrisReload(1) + + if (tc is "") + let result = s:IdrisCommand(":mc!", cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + call search("_") + endif + endif +endfunction + +function! IdrisAddClause(proof) + let view = winsaveview() + w + let cline = line(".") + let word = expand("<cword>") + let tc = IdrisReloadToLine(cline) + + if (tc is "") + if (a:proof==0) + let fn = ":ac!" + else + let fn = ":apc!" + endif + + let result = s:IdrisCommand(fn, cline, word) + if (! (result is "")) + call IWrite(result) + else + e + call winrestview(view) + call search(word) + + endif + endif +endfunction + +function! IdrisEval() + w + let tc = IdrisReload(1) + if (tc is "") + let expr = input ("Expression: ") + let result = s:IdrisCommand(expr) + call IWrite(" = " . result) + endif +endfunction + +nnoremap <buffer> <silent> <LocalLeader>t :call IdrisShowType()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>r :call IdrisReload(0)<ENTER> +nnoremap <buffer> <silent> <LocalLeader>c :call IdrisCaseSplit()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>d 0:call search(":")<ENTER>b:call IdrisAddClause(0)<ENTER>w +nnoremap <buffer> <silent> <LocalLeader>b 0:call IdrisAddClause(0)<ENTER> +nnoremap <buffer> <silent> <LocalLeader>m :call IdrisAddMissing()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>md 0:call search(":")<ENTER>b:call IdrisAddClause(1)<ENTER>w +nnoremap <buffer> <silent> <LocalLeader>f :call IdrisRefine()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>o :call IdrisProofSearch(0)<ENTER> +nnoremap <buffer> <silent> <LocalLeader>p :call IdrisProofSearch(1)<ENTER> +nnoremap <buffer> <silent> <LocalLeader>l :call IdrisMakeLemma()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>e :call IdrisEval()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>w 0:call IdrisMakeWith()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>mc :call IdrisMakeCase()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>i 0:call IdrisResponseWin()<ENTER> +nnoremap <buffer> <silent> <LocalLeader>h :call IdrisShowDoc()<ENTER> + +menu Idris.Reload <LocalLeader>r +menu Idris.Show\ Type <LocalLeader>t +menu Idris.Evaluate <LocalLeader>e +menu Idris.-SEP0- : +menu Idris.Add\ Clause <LocalLeader>d +menu Idris.Add\ with <LocalLeader>w +menu Idris.Case\ Split <LocalLeader>c +menu Idris.Add\ missing\ cases <LocalLeader>m +menu Idris.Proof\ Search <LocalLeader>o +menu Idris.Proof\ Search\ with\ hints <LocalLeader>p + +au BufHidden idris-response call IdrisHideResponseWin() +au BufEnter idris-response call IdrisShowResponseWin() |