summaryrefslogtreecommitdiffstats
path: root/ftplugin
diff options
context:
space:
mode:
Diffstat (limited to 'ftplugin')
-rw-r--r--ftplugin/idris2.vim334
1 files changed, 334 insertions, 0 deletions
diff --git a/ftplugin/idris2.vim b/ftplugin/idris2.vim
new file mode 100644
index 00000000..420bc52d
--- /dev/null
+++ b/ftplugin/idris2.vim
@@ -0,0 +1,334 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1
+
+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))
+" echo("idris2 " . expand ('%:p') . " --client " . idriscmd)
+ return system("idris2 --find-ipkg " . shellescape(expand('%:p')) . " --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 = system("idris2 --find-ipkg " . shellescape(file) . " --client ''")
+ if (! (tc is ""))
+ call IWrite(tc)
+ else
+ if (a:q==0)
+ call IWrite("Successfully reloaded " . file)
+ 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 ccol = col(".")
+ let ty = s:IdrisCommand(":t", word)
+ call IWrite(ty)
+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()
+
+ if (a:hint==0)
+ let hints = ""
+ else
+ let hints = input ("Hints: ")
+ endif
+
+ let result = s:IdrisCommand(":ps!", cline, word, hints)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ endif
+endfunction
+
+function! IdrisGenerateDef()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = s:currentQueryObject()
+
+ let result = s:IdrisCommand(":gd!", cline, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ endif
+endfunction
+
+function! IdrisMakeLemma()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = s:currentQueryObject()
+
+ let result = s:IdrisCommand(":ml!", cline, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ call search(word, "b")
+ endif
+endfunction
+
+function! IdrisRefine()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = expand("<cword>")
+ let name = input ("Name: ")
+
+ let result = s:IdrisCommand(":ref!", cline, word, name)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ endif
+endfunction
+
+function! IdrisAddMissing()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = expand("<cword>")
+
+ let result = s:IdrisCommand(":am!", cline, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ endif
+endfunction
+
+function! IdrisCaseSplit()
+ w
+ let view = winsaveview()
+ let cline = line(".")
+ let ccol = col(".")
+ let word = expand("<cword>")
+ let result = s:IdrisCommand(":cs!", cline, ccol, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ endif
+endfunction
+
+function! IdrisMakeWith()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = s:currentQueryObject()
+ let tc = IdrisReload(1)
+
+ let result = s:IdrisCommand(":mw!", cline, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ call search("_")
+ endif
+endfunction
+
+function! IdrisMakeCase()
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = s:currentQueryObject()
+
+ let result = s:IdrisCommand(":mc!", cline, word)
+ if (! (result is ""))
+ call IWrite(result)
+ else
+ e
+ call winrestview(view)
+ call search("_")
+ endif
+endfunction
+
+function! IdrisAddClause(proof)
+ let view = winsaveview()
+ w
+ let cline = line(".")
+ let word = expand("<cword>")
+
+ 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
+endfunction
+
+function! IdrisEval()
+ w
+ let expr = input ("Expression: ")
+ let result = s:IdrisCommand(expr)
+ call IWrite(" = " . result)
+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>a 0:call search(":")<ENTER>b:call IdrisAddClause(0)<ENTER>w
+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>s :call IdrisProofSearch(0)<ENTER>
+nnoremap <buffer> <silent> <LocalLeader>g :call IdrisGenerateDef()<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>a
+menu Idris.Generate\ Definition <LocalLeader>g
+menu Idris.Add\ with <LocalLeader>w
+menu Idris.Case\ Split <LocalLeader>c
+menu Idris.Add\ missing\ cases <LocalLeader>m
+menu Idris.Proof\ Search <LocalLeader>s
+menu Idris.Proof\ Search\ with\ hints <LocalLeader>p
+
+au BufHidden idris-response call IdrisHideResponseWin()
+au BufEnter idris-response call IdrisShowResponseWin()
+
+endif