summaryrefslogtreecommitdiffstats
path: root/ftplugin
diff options
context:
space:
mode:
Diffstat (limited to 'ftplugin')
-rw-r--r--ftplugin/idris.vim346
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()