diff options
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | after/ftplugin/idris2.vim | 5 | ||||
| -rw-r--r-- | after/syntax/idris2.vim | 82 | ||||
| -rw-r--r-- | autoload/cargo/quickfix.vim | 3 | ||||
| -rw-r--r-- | autoload/polyglot.vim | 44 | ||||
| -rw-r--r-- | autoload/rustfmt.vim | 4 | ||||
| -rw-r--r-- | autoload/sleuth.vim | 2 | ||||
| -rw-r--r-- | doc/idris2-vim.txt | 158 | ||||
| -rw-r--r-- | ftdetect/polyglot.vim | 11 | ||||
| -rw-r--r-- | ftplugin/idris2.vim | 334 | ||||
| -rw-r--r-- | heuristics.yaml | 30 | ||||
| -rw-r--r-- | indent/idris2.vim | 148 | ||||
| -rw-r--r-- | packages.yaml | 13 | ||||
| -rwxr-xr-x | scripts/build | 6 | ||||
| -rw-r--r-- | scripts/test_extensions.vim | 30 | ||||
| -rw-r--r-- | scripts/test_filetypes.vim | 2 | ||||
| -rw-r--r-- | syntax/idris2.vim | 85 | ||||
| -rw-r--r-- | syntax/lidris2.vim | 26 | ||||
| -rw-r--r-- | syntax/rust.vim | 3 | 
19 files changed, 982 insertions, 7 deletions
| @@ -7,7 +7,7 @@ A collection of language packs for Vim.  > One to rule them all, one to find them, one to bring them all and in the darkness bind them.  - It **won't affect your startup time**, as scripts are loaded only on demand\*. -- It **installs and updates 120+ times faster** than the <!--Package Count-->190<!--/Package Count--> packages it consists of. +- It **installs and updates 120+ times faster** than the <!--Package Count-->191<!--/Package Count--> packages it consists of.  - It is more secure because scripts loaded for all extensions are generated by vim-polyglot (ftdetect).  - Solid syntax and indentation support (other features skipped). Only the best language packs.  - All unnecessary files are ignored (like enormous documentation from php support). @@ -130,6 +130,7 @@ If you need full functionality of any plugin, please use it directly with your p  - [html5](https://github.com/othree/html5.vim)  - [i3](https://github.com/mboughaba/i3config.vim)  - [icalendar](https://github.com/chutzpah/icalendar.vim) +- [idris2](https://github.com/edwinb/idris2-vim)  - [idris](https://github.com/idris-hackers/idris-vim)  - [ion](https://github.com/vmchale/ion-vim)  - [javascript-sql](https://github.com/statico/vim-javascript-sql) diff --git a/after/ftplugin/idris2.vim b/after/ftplugin/idris2.vim new file mode 100644 index 00000000..b96ae5b6 --- /dev/null +++ b/after/ftplugin/idris2.vim @@ -0,0 +1,5 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +setlocal iskeyword+=' + +endif diff --git a/after/syntax/idris2.vim b/after/syntax/idris2.vim new file mode 100644 index 00000000..85f674a9 --- /dev/null +++ b/after/syntax/idris2.vim @@ -0,0 +1,82 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +" This script allows for unicode concealing of certain characters +" For instance -> goes to → +" +" It needs vim >= 7.3, set nocompatible, set enc=utf-8 +" +" If you want to turn this on, let g:idris_conceal = 1 + +if !exists('g:idris_conceal') || !has('conceal') || &enc != 'utf-8' +    finish +endif + +" vim: set fenc=utf-8: +syntax match idrNiceOperator "\\\ze[[:alpha:][:space:]_([]" conceal cchar=λ +syntax match idrNiceOperator "<-" conceal cchar=← +syntax match idrNiceOperator "->" conceal cchar=→ +syntax match idrNiceOperator "\<sum\>" conceal cchar=∑ +syntax match idrNiceOperator "\<product\>" conceal cchar=∏ +syntax match idrNiceOperator "\<sqrt\>" conceal cchar=√ +syntax match idrNiceOperator "\<pi\>" conceal cchar=π +syntax match idrNiceOperator "==" conceal cchar=≡ +syntax match idrNiceOperator "\/=" conceal cchar=≠ + + +let s:extraConceal = 1 + +let s:doubleArrow = 1 +" Set this to 0 to use the more technically correct arrow from bar + +" Some windows font don't support some of the characters, +" so if they are the main font, we don't load them :) +if has("win32") +    let s:incompleteFont = [ 'Consolas' +                        \ , 'Lucida Console' +                        \ , 'Courier New' +                        \ ] +    let s:mainfont = substitute( &guifont, '^\([^:,]\+\).*', '\1', '') +    for s:fontName in s:incompleteFont +        if s:mainfont ==? s:fontName +            let s:extraConceal = 0 +            break +        endif +    endfor +endif + +if s:extraConceal +    syntax match idrNiceOperator "Void" conceal cchar=⊥ + +    " Match greater than and lower than w/o messing with Kleisli composition +    syntax match idrNiceOperator "<=\ze[^<]" conceal cchar=≤ +    syntax match idrNiceOperator ">=\ze[^>]" conceal cchar=≥ + +    if s:doubleArrow +      syntax match idrNiceOperator "=>" conceal cchar=⇒ +    else +      syntax match idrNiceOperator "=>" conceal cchar=↦ +    endif + +    syntax match idrNiceOperator "=\zs<<" conceal cchar=« + +    syntax match idrNiceOperator "++" conceal cchar=⧺ +    syntax match idrNiceOperator "::" conceal cchar=∷ +    syntax match idrNiceOperator "-<" conceal cchar=↢ +    syntax match idrNiceOperator ">-" conceal cchar=↣ +    syntax match idrNiceOperator "-<<" conceal cchar=⤛ +    syntax match idrNiceOperator ">>-" conceal cchar=⤜ + +    " Only replace the dot, avoid taking spaces around. +    syntax match idrNiceOperator /\s\.\s/ms=s+1,me=e-1 conceal cchar=∘ +    syntax match idrNiceOperator "\.\." conceal cchar=‥ + +    syntax match idrNiceOperator "`elem`" conceal cchar=∈ +    syntax match idrNiceOperator "`notElem`" conceal cchar=∉ +endif + +hi link idrNiceOperator Operator +hi! link Conceal Operator +setlocal conceallevel=2 + + +endif diff --git a/autoload/cargo/quickfix.vim b/autoload/cargo/quickfix.vim index e1e5b9d2..cce7fcbb 100644 --- a/autoload/cargo/quickfix.vim +++ b/autoload/cargo/quickfix.vim @@ -1,7 +1,8 @@  if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1  function! cargo#quickfix#CmdPre() abort -    if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo' +    if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo' && +         \ &makeprg =~ '\V\^cargo\ \.\*'          " Preserve the current directory, and 'lcd' to the nearest Cargo file.          let b:rust_compiler_cargo_qf_has_lcd = haslocaldir()          let b:rust_compiler_cargo_qf_prev_cd = getcwd() diff --git a/autoload/polyglot.vim b/autoload/polyglot.vim index 3753dc8e..eca7e304 100644 --- a/autoload/polyglot.vim +++ b/autoload/polyglot.vim @@ -212,6 +212,50 @@ func! polyglot#DetectReFiletype()    endfor  endfunc +func! polyglot#DetectIdrFiletype() +  for lnum in range(1, min([line("$"), 5])) +    let line = getline(lnum) +    if line =~# '^\s*--.*[Ii]dris \=1' +      setf idris | return +    endif +    if line =~# '^\s*--.*[Ii]dris \=2' +      setf idris2 | return +    endif +  endfor +  for lnum in range(1, min([line("$"), 30])) +    let line = getline(lnum) +    if line =~# '^pkgs =.*' +      setf idris | return +    endif +    if line =~# '^depends =.*' +      setf idris2 | return +    endif +    if line =~# '^%language \(TypeProviders\|ElabReflection\)' +      setf idris | return +    endif +    if line =~# '^%language PostfixProjections' +      setf idris2 | return +    endif +    if line =~# '^%access .*' +      setf idris | return +    endif +    if exists("g:filetype_idr") +      exe "setf " . g:filetype_idr | return +    endif +  endfor +  setf idris2 | return +endfunc + +func! polyglot#DetectLidrFiletype() +  for lnum in range(1, min([line("$"), 200])) +    let line = getline(lnum) +    if line =~# '^>\s*--.*[Ii]dris \=1' +      setf lidris | return +    endif +  endfor +  setf lidris2 | return +endfunc +  " Restore 'cpoptions'  let &cpo = s:cpo_save  unlet s:cpo_save diff --git a/autoload/rustfmt.vim b/autoload/rustfmt.vim index 514e4147..60e2029e 100644 --- a/autoload/rustfmt.vim +++ b/autoload/rustfmt.vim @@ -65,12 +65,12 @@ endfunction  function! s:RustfmtConfigOptions()      let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';')      if l:rustfmt_toml !=# '' -        return '--config-path '.fnamemodify(l:rustfmt_toml, ":p") +        return '--config-path '.shellescape(fnamemodify(l:rustfmt_toml, ":p"))      endif      let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';')      if l:_rustfmt_toml !=# '' -        return '--config-path '.fnamemodify(l:_rustfmt_toml, ":p") +        return '--config-path '.shellescape(fnamemodify(l:_rustfmt_toml, ":p"))      endif      " Default to edition 2018 in case no rustfmt.toml was found. diff --git a/autoload/sleuth.vim b/autoload/sleuth.vim index a912cda4..e70169cb 100644 --- a/autoload/sleuth.vim +++ b/autoload/sleuth.vim @@ -103,6 +103,7 @@ let s:globs = {    \ 'i3config': '*.i3.config,*.i3config,i3.config,i3config',    \ 'icalendar': '*.ics',    \ 'idris': '*.idr,*.lidr,idris-response', +  \ 'idris2': '*.idr,*.ipkg,idris-response',    \ 'ion': '*.ion',    \ 'javascript': '*.js,*._js,*.bones,*.cjs,*.es,*.es6,*.frag,*.gs,*.jake,*.jsb,*.jscad,*.jsfl,*.jsm,*.jss,*.mjs,*.njs,*.pac,*.sjs,*.ssjs,*.xsjs,*.xsjslib,Jakefile',    \ 'javascriptreact': '*.jsx', @@ -116,6 +117,7 @@ let s:globs = {    \ 'kotlin': '*.kt,*.ktm,*.kts',    \ 'ledger': '*.ldg,*.ledger,*.journal',    \ 'less': '*.less', +  \ 'lidris2': '*.lidr',    \ 'lilypond': '*.ly,*.ily',    \ 'litcoffee': '*.litcoffee,*.coffee.md',    \ 'livescript': '*.ls,*._ls,Slakefile', diff --git a/doc/idris2-vim.txt b/doc/idris2-vim.txt new file mode 100644 index 00000000..80a53cfc --- /dev/null +++ b/doc/idris2-vim.txt @@ -0,0 +1,158 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +*idris2-vim.txt*   Last change 2020 February 22 +=============================================================================== +=============================================================================== +   @@@@ @@@@@@@@  @@@@@@@@  @@@@  @@@@@@          @@     @@ @@@@ @@     @@ +    @@  @@     @@ @@     @@  @@  @@    @@         @@     @@  @@  @@@   @@@ +    @@  @@     @@ @@     @@  @@  @@               @@     @@  @@  @@@@ @@@@ +    @@  @@     @@ @@@@@@@@   @@   @@@@@@  @@@@@@@ @@     @@  @@  @@ @@@ @@ +    @@  @@     @@ @@   @@    @@        @@          @@   @@   @@  @@     @@ +    @@  @@     @@ @@    @@   @@  @@    @@           @@ @@    @@  @@     @@ +   @@@@ @@@@@@@@  @@     @@ @@@@  @@@@@@             @@@    @@@@ @@     @@ +=============================================================================== +CONTENTS                                                   *idris-vim-contents* + +  1. Features:                                   |idris-vim-features| +  2. Requirements:                               |idris-vim-requirements| +  3. Functions:                                  |idris-vim-functions| +  4. Troubleshooting                             |idris-vim-troubleshooting| +  5. Examples:                                   |idris-vim-examples| +  6. Information:                                |idris-vim-information| + +=============================================================================== +FEATURES                                                   *idris-vim-features* + +  * Syntax Highlighting +  * Indentation +  * Unicode Concealing +  * Syntax Checking (via Syntastic(https://github.com/scrooloose/syntastic)) +  * Interactive Editing via the REPL + +=============================================================================== +REQUIREMENTS                                           *idris-vim-requirements* + +  * Idris2 (https://github.com/edwinb/Idris2/) + +  OPTIONAL: + +    * Syntastic(https://github.com/scrooloose/syntastic) for syntax checking +    * Vimshell(https://github.com/Shougo/vimshell.vim) for a REPL + +=============================================================================== +FUNCTIONS                                                 *idris-vim-functions* + +All of the functions in idris-vim are essentially just calls back to the REPL, +so documentation for each of them is also available there. + +IdrisDocumentation                                           *IdrisDocumentation* +  Shows internal documentation of the primitive under the cursor. + +  Mapped to '<LocalLeader>_h' by default. + +IdrisResponseWin                                              *IdrisResponseWin* +  This opens an idris response window in a new pane. + +  Mapped to '<LocalLeader>_i' by default. + +IdrisShowType                                                    *IdrisShowType* +  This shows the type of the name under the cursor (or, if the cursor happens +  to be over a metavariable, a bit more information about its context). + +  Mapped to '<LocalLeader>_t' by default. + +IdrisReload                                                        *IdrisReload* +  This reloads the file and type-checks the file in the current buffer. + +  Mapped to '<LocalLeader>_r' by default. + +IdrisEval                                                            *IdrisEval* +  This prompts for an expression and then evaluates it in the REPL, then +  returns the result. + +  Mapped to '<LocalLeader>_e' by default. + +IdrisCaseSplit                                                 *IdrisCaseSplit* +  When the cursor is over a variable in a pattern match clause or case +  expression, this splits the variable into all well-typed patterns. + +  Mapped to '<LocalLeader>_c' by default + +IdrisAddClause                                                 *IdrisAddClause* +  When the cursor is at a type declaration this creates a new clause for that +  signature. + +  By default mapped to '<LocalLeader>_d' for an ordinary top-level definition, +  '<LocalLeader>_b' for a typeclass instance definition, and +  '<LocalLeader>_md' to add a pattern-matching proof clause. + +IdrisAddMissing:                                               *IdrisAddMissing* +  When the cursor is over a function, this adds all clauses necessary to make +  that function cover all inputs.  This also eliminates clauses which would +  lead to unification errors from appearing. + +  Mapped to '<LocalLeader>_m' by default + +IdrisRefine:                                                      *IdrisRefine* +  Refines the item the cursor is over (applies the name and fills in any +  arguments which can be filled in via unification) + +  Mapped to '<LocalLeader>_f' by default + +IdrisProofSearch:                                             *IdrisProofSearch* +  This attempts to find a value for the metavariable it was called on by +  looking at the rest of the code.  It can also be called with hints, which +  are functions that can apply to help solve for the metavariable. + +  Mapped to '<LocalLeader>_o' without hints and '<LocalLeader>p' with hints by +  default + +IdrisMakeWith:                                                   *IdrisMakeWith* +  When the cursor is over a pattern clause and this is called, it creates a +  new with clause. + +  Mapped to '<LocalLeader>_w' by default + +IdrisMakeLemma:                                                   *IdrisMakeLemma* +  When the cursor is over a metavariable and this is called, it creates a new +  top-level definition to solve the metavariable. + +  Mapped to '<LocalLeader>_l' by default + +=============================================================================== +TROUBLESHOOTING                                      *idris-vim-troubleshooting* + +If this isn't working for you, make sure that: + +  * There is an Idris REPL running +  * For syntax checking, you have syntastic installed +  * The plugins mappings exists and don't conflict with anything else installed +    (You can use ':map' to check. There should be mappings similar to +    '\h * :call IdrisShowDoc()'.) +  * Vim recognizes you're in an idris file (you can use ':verb set ft' to check) + +If none of this works, check to issue tracker on github and if nothing is +there create an issue with a detailed description of the problem. + +=============================================================================== +EXAMPLES                                                    *idris-vim-examples* + +Some excellent tutorials/examples for interactive editing using the above +functions can be found at: +  http://edwinb.wordpress.com/2013/10/28/interactive-idris-editing-with-vim/ +and +  http://www.scribd.com/doc/214031954/60/Interactive-Editing-in-Vim + +=============================================================================== +INFORMATION                                              *idris-vim-information* + +Author: edwinb +Repo: https://github.com/idris-hackers/idris-vim + +Documentation by japesinator + +=============================================================================== +=============================================================================== +" vim:ft=help:et:ts=2:sw=2:sts=2:norl: + +endif diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index de4665b2..186ba9da 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -795,9 +795,16 @@ if !has_key(s:disabled_packages, 'icalendar')  endif  if !has_key(s:disabled_packages, 'idris') -  au BufNewFile,BufRead *.idr setf idris -  au BufNewFile,BufRead *.lidr setf idris    au BufNewFile,BufRead idris-response setf idris +  au! BufNewFile,BufRead *.idr call polyglot#DetectIdrFiletype() +  au! BufNewFile,BufRead *.lidr call polyglot#DetectLidrFiletype() +endif + +if !has_key(s:disabled_packages, 'idris2') +  au BufNewFile,BufRead *.ipkg setf idris2 +  au BufNewFile,BufRead idris-response setf idris2 +  au! BufNewFile,BufRead *.idr call polyglot#DetectIdrFiletype() +  au! BufNewFile,BufRead *.lidr call polyglot#DetectLidrFiletype()  endif  if !has_key(s:disabled_packages, 'ion') 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 diff --git a/heuristics.yaml b/heuristics.yaml index 97999022..33c1c690 100644 --- a/heuristics.yaml +++ b/heuristics.yaml @@ -63,3 +63,33 @@ rules:    - pattern: '^\s*#(?:(?:if|ifdef|define|pragma)\s+\w|\s*include\s+[<"]|template\s*<)'      filetype: cpp    - filetype: reason +--- +extensions: [idr] +rules: +- lines: 5 +  rules: +  - pattern: '^\s*--.*[Ii]dris ?1' +    filetype: idris +  - pattern: '^\s*--.*[Ii]dris ?2' +    filetype: idris2 +- lines: 30 +  rules: +  - pattern: '^pkgs =.*' +    filetype: idris +  - pattern: '^depends =.*' +    filetype: idris2 +  - pattern: '^%language (TypeProviders|ElabReflection)' +    filetype: idris +  - pattern: '^%language PostfixProjections' +    filetype: idris2 +  - pattern: '^%access .*' +    filetype: idris +  - override: 'g:filetype_idr' +- filetype: idris2 +--- +extensions: [lidr] +rules: +- lines: 200 +  pattern: '^>\s*--.*[Ii]dris ?1' +  filetype: lidris +- filetype: lidris2 diff --git a/indent/idris2.vim b/indent/idris2.vim new file mode 100644 index 00000000..83995423 --- /dev/null +++ b/indent/idris2.vim @@ -0,0 +1,148 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +" indentation for idris (idris-lang.org) +" +" Based on haskell indentation by motemen <motemen@gmail.com> +" +" author: raichoo (raichoo@googlemail.com) +" +" Modify g:idris_indent_if and g:idris_indent_case to +" change indentation for `if'(default 3) and `case'(default 5). +" Example (in .vimrc): +" > let g:idris_indent_if = 2 + +if exists('b:did_indent') +  finish +endif + +let b:did_indent = 1 + +if !exists('g:idris_indent_if') +  " if bool +  " >>>then ... +  " >>>else ... +  let g:idris_indent_if = 3 +endif + +if !exists('g:idris_indent_case') +  " case xs of +  " >>>>>[]      => ... +  " >>>>>(y::ys) => ... +  let g:idris_indent_case = 5 +endif + +if !exists('g:idris_indent_let') +  " let x : Nat = O in +  " >>>>x +  let g:idris_indent_let = 4 +endif + +if !exists('g:idris_indent_rewrite') +  " rewrite prf in expr +  " >>>>>>>>x +  let g:idris_indent_rewrite = 8 +endif + +if !exists('g:idris_indent_where') +  " where f : Nat -> Nat +  " >>>>>>f x = x +  let g:idris_indent_where = 6 +endif + +if !exists('g:idris_indent_do') +  " do x <- a +  " >>>y <- b +  let g:idris_indent_do = 3 +endif + +setlocal indentexpr=GetIdrisIndent() +setlocal indentkeys=!^F,o,O,} + +function! GetIdrisIndent() +  let prevline = getline(v:lnum - 1) + +  if prevline =~ '\s\+(\s*.\+\s\+:\s\+.\+\s*)\s\+->\s*$' +    return match(prevline, '(') +  elseif prevline =~ '\s\+{\s*.\+\s\+:\s\+.\+\s*}\s\+->\s*$' +    return match(prevline, '{') +  endif + +  if prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$' +    let s = match(prevline, '[:=]') +    if s > 0 +      return s + 2 +    else +      return match(prevline, '\S') +    endif +  endif + +  if prevline =~ '[{([][^})\]]\+$' +    return match(prevline, '[{([]') +  endif + +  if prevline =~ '\<let\>\s\+.\+\<in\>\s*$' +    return match(prevline, '\<let\>') + g:idris_indent_let +  endif + +  if prevline =~ '\<rewrite\>\s\+.\+\<in\>\s*$' +    return match(prevline, '\<rewrite\>') + g:idris_indent_rewrite +  endif + +  if prevline !~ '\<else\>' +    let s = match(prevline, '\<if\>.*\&.*\zs\<then\>') +    if s > 0 +      return s +    endif + +    let s = match(prevline, '\<if\>') +    if s > 0 +      return s + g:idris_indent_if +    endif +  endif + +  if prevline =~ '\(\<where\>\|\<do\>\|=\|[{([]\)\s*$' +    return match(prevline, '\S') + &shiftwidth +  endif + +  if prevline =~ '\<where\>\s\+\S\+.*$' +    return match(prevline, '\<where\>') + g:idris_indent_where +  endif + +  if prevline =~ '\<do\>\s\+\S\+.*$' +    return match(prevline, '\<do\>') + g:idris_indent_do +  endif + +  if prevline =~ '^\s*\<\(co\)\?data\>\s\+[^=]\+\s\+=\s\+\S\+.*$' +    return match(prevline, '=') +  endif + +  if prevline =~ '\<with\>\s\+([^)]*)\s*$' +    return match(prevline, '\S') + &shiftwidth +  endif + +  if prevline =~ '\<case\>\s\+.\+\<of\>\s*$' +    return match(prevline, '\<case\>') + g:idris_indent_case +  endif + +  if prevline =~ '^\s*\(\<namespace\>\|\<\(co\)\?data\>\)\s\+\S\+\s*$' +    return match(prevline, '\(\<namespace\>\|\<\(co\)\?data\>\)') + &shiftwidth +  endif + +  if prevline =~ '^\s*\(\<using\>\|\<parameters\>\)\s*([^(]*)\s*$' +    return match(prevline, '\(\<using\>\|\<parameters\>\)') + &shiftwidth +  endif + +  if prevline =~ '^\s*\<mutual\>\s*$' +    return match(prevline, '\<mutual\>') + &shiftwidth +  endif + +  let line = getline(v:lnum) + +  if (line =~ '^\s*}\s*' && prevline !~ '^\s*;') +    return match(prevline, '\S') - &shiftwidth +  endif + +  return match(prevline, '\S') +endfunction + +endif diff --git a/packages.yaml b/packages.yaml index ca5de3a3..04dd4cd4 100644 --- a/packages.yaml +++ b/packages.yaml @@ -755,6 +755,19 @@ filetypes:    extra_filenames:    - idris-response  --- +name: idris2 +remote: edwinb/idris2-vim +filetypes: +- name: idris2 +  extensions: +  - idr +  - ipkg +  filenames: +  - idris-response +- name: lidris2 +  extensions: +  - lidr +---  name: ion  remote: vmchale/ion-vim  filetypes: diff --git a/scripts/build b/scripts/build index c7f4846f..79a1cfe7 100755 --- a/scripts/build +++ b/scripts/build @@ -77,6 +77,12 @@ def load_data()          filetype["extensions"] ||= []          filetype["filenames"] ||= []          filetype["interpreters"] ||= [] + +        filetype.keys.each do |key| +          if key.start_with?("extra_") +            raise "[#{filetype["name"]}]: #{key} is not allowed if linguist is not used" +          end +        end        end      end    end diff --git a/scripts/test_extensions.vim b/scripts/test_extensions.vim index c45431d5..9211818d 100644 --- a/scripts/test_extensions.vim +++ b/scripts/test_extensions.vim @@ -190,6 +190,11 @@ call TestExtension('yaml.ansible', 'requirements.yaml', '')  call TestExtension('ps1xml', 'foobar.ps1xml', '')  call TestExtension('terraform', 'terraform.tf', '') +call TestExtension('idris2', 'foobar.idr', '') +call TestExtension('idris', 'foobar.idr', "pkgs : List String\npkgs = [\"NCurses\", \"Readline\"]") +let g:filetype_idr = 'fizfuz' +call TestExtension('fizfuz', 'fizfuz.idr', '') +  " .m extension  call TestExtension('octave', 'matlab.m', '')  call TestExtension('objc', 'objc.m', "\n\n  #import <Foundation/Foundation.h>") @@ -215,3 +220,28 @@ call TestExtension('cpp', 'cpp.re', '#include "config.h"')  call TestExtension('cpp', 'cpp2.re', '#ifdef HAVE_CONFIG_H')  call TestExtension('cpp', 'cpp3.re', '#define YYCTYPE unsigned char')  call TestExtension('reason', 'react.re', 'ReasonReact.Router.push("");') + +" Idris +call TestExtension('idris', 'lowercase.idr', '--idris1') +call TestExtension('idris', 'uppercase.idr', '--Idris1') +call TestExtension('idris', 'start-space-l.idr', '-- idris1') +call TestExtension('idris', 'start-space-u.idr', '-- Idris1') +call TestExtension('idris', 'two-spaces-l.idr', '-- idris 1') +call TestExtension('idris', 'two-spaces-u.idr', '-- Idris 1') +"call TestExtension('idris', 'mypkg.ipkg', 'package mypkg\n\npkgs = pruviloj, lightyear') +call TestExtension('idris', 'use-type-prov.idr', '%language TypeProviders') +call TestExtension('idris', 'use-elab-refl.idr', '%language ElabReflection') +call TestExtension('idris', 'access-modifier.idr', '%access export\n\npublic export\nMyTest : Type-> Type\n\nfact : Nat -> Nat') +call TestExtension('idris2', 'lowercase.idr', '--idris2') +call TestExtension('idris2', 'uppercase.idr', '--Idris2') +call TestExtension('idris2', 'start-space-l.idr', '-- idris2') +call TestExtension('idris2', 'start-space-u.idr', '-- Idris2') +call TestExtension('idris2', 'two-spaces-l.idr', '-- idris 2') +call TestExtension('idris2', 'two-spaces-u.idr', '-- Idris 2') +call TestExtension('idris2', 'mypkg.ipkg', 'package mypkg\n\ndepends = effects') +call TestExtension('idris2', 'use-post-proj.idr', '%language PostfixProjections') + +" Literate Idris +call TestExtension('lidris', 'lidris-1.lidr', "Some test plaintext\n\n> --idris1\n> myfact : Nat -> Nat\n> myfact Z = 1\n> myfact (S k) = (S k) * myfact k\n\nMore plaintext") +call TestExtension('lidris2', 'lidris-2.lidr', "Some test plaintext\n\n> --idris2\n> myfact : Nat -> Nat\n> myfact Z = 1\n> myfact (S k) = (S k) * myfact k\n\nMore plaintext") + diff --git a/scripts/test_filetypes.vim b/scripts/test_filetypes.vim index d0bec4cc..0f870d5a 100644 --- a/scripts/test_filetypes.vim +++ b/scripts/test_filetypes.vim @@ -106,6 +106,8 @@ call TestFiletype('html')  call TestFiletype('i3config')  call TestFiletype('icalendar')  call TestFiletype('idris') +call TestFiletype('idris2') +call TestFiletype('lidris2')  call TestFiletype('ion')  call TestFiletype('javascript')  call TestFiletype('flow') diff --git a/syntax/idris2.vim b/syntax/idris2.vim new file mode 100644 index 00000000..6bd18c58 --- /dev/null +++ b/syntax/idris2.vim @@ -0,0 +1,85 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +" syntax highlighting for Idris 2 (idris-lang.org) +" +" Heavily modified version of the haskell syntax +" highlighter to support Idris 2. +" +" author: raichoo (raichoo@googlemail.com) + +if exists("b:current_syntax") +  finish +endif + +syn match idrisTypeDecl "[a-zA-Z][a-zA-z0-9_']*\s\+:\s\+" +  \ contains=idrisIdentifier,idrisOperators +syn region idrisParens matchgroup=idrisDelimiter start="(" end=")" contains=TOP,idrisTypeDecl +syn region idrisBrackets matchgroup=idrisDelimiter start="\[" end="]" contains=TOP,idrisTypeDecl +syn region idrisBlock matchgroup=idrisDelimiter start="{" end="}" contains=TOP,idrisTypeDecl +syn keyword idrisModule module namespace +syn keyword idrisImport import +syn keyword idrisStructure data record interface implementation +syn keyword idrisWhere where +syn keyword idrisVisibility public abstract private export +syn keyword idrisBlock parameters mutual using +syn keyword idrisTotality total partial covering +syn keyword idrisAnnotation auto impossible default constructor +syn keyword idrisStatement do case of rewrite with +syn keyword idrisLet let in +syn keyword idrisForall forall +syn keyword idrisDataOpt noHints uniqueSearch search external noNewtype containedin=idrisBrackets +syn match idrisSyntax "\(pattern \+\|term \+\)\?syntax" +syn keyword idrisConditional if then else +syn match idrisNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>" +syn match idrisFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>" +syn match idrisDelimiter  "[,;]" +syn keyword idrisInfix prefix infix infixl infixr +syn match idrisOperators "\([-!#$%&\*\+./<=>\?@\\^|~:]\|\<_\>\)" +syn match idrisType "\<[A-Z][a-zA-Z0-9_']*\>" +syn keyword idrisTodo TODO FIXME XXX HACK contained +syn match idrisLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=idrisTodo,@Spell +syn match idrisDocComment "|||\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$" contains=idrisTodo,@Spell +syn match idrisMetaVar "?[a-z][A-Za-z0-9_']*" +syn match idrisPragma "%\(hide\|logging\|auto_lazy\|unbound_implicits\|undotted_record_projections\|amibguity_depth\|pair\|rewrite\|integerLit\|stringLit\|charLit\|name\|start\|allow_overloads\|language\|default\|transform\|hint\|global_hint\|defaulthint\|inline\|extern\|macro\|spec\|foreign\|runElab\|tcinline\)" +syn match idrisChar "'[^'\\]'\|'\\.'\|'\\u[0-9a-fA-F]\{4}'" +syn match idrisBacktick "`[A-Za-z][A-Za-z0-9_']*`" +syn region idrisString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell +syn region idrisBlockComment start="{-" end="-}" contains=idrisBlockComment,idrisTodo,@Spell +syn match idrisIdentifier "[a-zA-Z][a-zA-z0-9_']*" contained + +highlight def link idrisDeprecated Error +highlight def link idrisIdentifier Identifier +highlight def link idrisImport Structure +highlight def link idrisModule Structure +highlight def link idrisStructure Structure +highlight def link idrisStatement Statement +highlight def link idrisForall Structure +highlight def link idrisDataOpt Statement +highlight def link idrisDSL Statement +highlight def link idrisBlock Statement +highlight def link idrisAnnotation Statement +highlight def link idrisWhere Structure +highlight def link idrisLet Structure +highlight def link idrisTotality Statement +highlight def link idrisSyntax Statement +highlight def link idrisVisibility Statement +highlight def link idrisConditional Conditional +highlight def link idrisPragma Statement +highlight def link idrisNumber Number +highlight def link idrisFloat Float +highlight def link idrisDelimiter Delimiter +highlight def link idrisInfix PreProc +highlight def link idrisOperators Operator +highlight def link idrisType Include +highlight def link idrisDocComment Comment +highlight def link idrisLineComment Comment +highlight def link idrisBlockComment Comment +highlight def link idrisTodo Todo +highlight def link idrisMetaVar Macro +highlight def link idrisString String +highlight def link idrisChar String +highlight def link idrisBacktick Operator + +let b:current_syntax = "idris2" + +endif diff --git a/syntax/lidris2.vim b/syntax/lidris2.vim new file mode 100644 index 00000000..a4757205 --- /dev/null +++ b/syntax/lidris2.vim @@ -0,0 +1,26 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1 + +" Vim syntax file +" Language:    Literate Idris 2 +" Maintainer:  Idris Hackers (https://github.com/edwinb/idris2-vim) +" Last Change: 2020 May 19 +" Version:     0.1 +" +" This is just a minimal adaption of the Literate Haskell syntax file. + + +" Read Idris highlighting. +if version < 600 +    syntax include @idrisTop <sfile>:p:h/idris2.vim +else +    syntax include @idrisTop syntax/idris2.vim +endif + +" Recognize blocks of Bird tracks, highlight as Idris. +syntax region lidrisBirdTrackBlock start="^>" end="\%(^[^>]\)\@=" contains=@idrisTop,lidrisBirdTrack +syntax match  lidrisBirdTrack "^>" contained +hi def link   lidrisBirdTrack Comment + +let b:current_syntax = "lidris2" + +endif diff --git a/syntax/rust.vim b/syntax/rust.vim index d1e9d8d4..2ad37ed8 100644 --- a/syntax/rust.vim +++ b/syntax/rust.vim @@ -67,10 +67,11 @@ syn match   rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifie  syn keyword   rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty  syn match     rustIdentifier  contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained -syn match     rustFuncName    "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained +syn match     rustFuncName    "\%(r#\)\=\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained  syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end="),\=[*+]" contains=TOP  syn match rustMacroVariable "$\w\+" +syn match rustRawIdent "\<r#\h\w*" contains=NONE  " Reserved (but not yet used) keywords {{{2  syn keyword   rustReservedKeyword become do priv typeof unsized abstract virtual final override | 
