idris2.vim (4530B)
1 " Vim indent file 2 " Language: Idris 2 3 " Maintainer: Idris Hackers (https://github.com/edwinb/idris2-vim), Serhii Khoma <srghma@gmail.com> 4 " Author: raichoo <raichoo@googlemail.com> 5 " Last Change: 2024 Nov 05 6 " License: Vim (see :h license) 7 " Repository: https://github.com/ShinKage/idris2-nvim 8 " 9 " indentation for idris (idris-lang.org) 10 " 11 " Based on haskell indentation by motemen <motemen@gmail.com> 12 " 13 " Indentation configuration variables: 14 " 15 " g:idris2_indent_if (default: 3) 16 " Controls indentation after 'if' statements 17 " Example: 18 " if condition 19 " >>>then expr 20 " >>>else expr 21 " 22 " g:idris2_indent_case (default: 5) 23 " Controls indentation of case expressions 24 " Example: 25 " case x of 26 " >>>>>Left y => ... 27 " >>>>>Right z => ... 28 " 29 " g:idris2_indent_let (default: 4) 30 " Controls indentation after 'let' bindings 31 " Example: 32 " let x = expr in 33 " >>>>body 34 " 35 " g:idris2_indent_rewrite (default: 8) 36 " Controls indentation after 'rewrite' expressions 37 " Example: 38 " rewrite proof in 39 " >>>>>>>>expr 40 " 41 " g:idris2_indent_where (default: 6) 42 " Controls indentation of 'where' blocks 43 " Example: 44 " function args 45 " >>>>>>where helper = expr 46 " 47 " g:idris2_indent_do (default: 3) 48 " Controls indentation in 'do' blocks 49 " Example: 50 " do x <- action 51 " >>>y <- action 52 " 53 " Example configuration in .vimrc: 54 " let g:idris2_indent_if = 2 55 56 if exists('b:did_indent') 57 finish 58 endif 59 60 setlocal indentexpr=GetIdrisIndent() 61 setlocal indentkeys=!^F,o,O,} 62 63 let b:did_indent = 1 64 let b:undo_indent = "setlocal indentexpr< indentkeys<" 65 66 " we want to use line continuations (\) BEGINNING 67 let s:cpo_save = &cpo 68 set cpo&vim 69 70 " Define defaults for indent configuration 71 let s:indent_defaults = { 72 \ 'idris2_indent_if': 3, 73 \ 'idris2_indent_case': 5, 74 \ 'idris2_indent_let': 4, 75 \ 'idris2_indent_rewrite': 8, 76 \ 'idris2_indent_where': 6, 77 \ 'idris2_indent_do': 3 78 \ } 79 80 " we want to use line continuations (\) END 81 let &cpo = s:cpo_save 82 unlet s:cpo_save 83 84 " Set up indent settings with user overrides 85 for [key, default] in items(s:indent_defaults) 86 let varname = 'g:' . key 87 if !exists(varname) 88 execute 'let' varname '=' default 89 endif 90 endfor 91 92 if exists("*GetIdrisIndent") 93 finish 94 endif 95 96 function! GetIdrisIndent() 97 let prevline = getline(v:lnum - 1) 98 99 if prevline =~ '\s\+(\s*.\+\s\+:\s\+.\+\s*)\s\+->\s*$' 100 return match(prevline, '(') 101 elseif prevline =~ '\s\+{\s*.\+\s\+:\s\+.\+\s*}\s\+->\s*$' 102 return match(prevline, '{') 103 endif 104 105 if prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$' 106 let s = match(prevline, '[:=]') 107 if s > 0 108 return s + 2 109 else 110 return match(prevline, '\S') 111 endif 112 endif 113 114 if prevline =~ '[{([][^})\]]\+$' 115 return match(prevline, '[{([]') 116 endif 117 118 if prevline =~ '\<let\>\s\+.\+\<in\>\s*$' 119 return match(prevline, '\<let\>') + g:idris2_indent_let 120 endif 121 122 if prevline =~ '\<rewrite\>\s\+.\+\<in\>\s*$' 123 return match(prevline, '\<rewrite\>') + g:idris2_indent_rewrite 124 endif 125 126 if prevline !~ '\<else\>' 127 let s = match(prevline, '\<if\>.*\&.*\zs\<then\>') 128 if s > 0 129 return s 130 endif 131 132 let s = match(prevline, '\<if\>') 133 if s > 0 134 return s + g:idris2_indent_if 135 endif 136 endif 137 138 if prevline =~ '\(\<where\>\|\<do\>\|=\|[{([]\)\s*$' 139 return match(prevline, '\S') + &shiftwidth 140 endif 141 142 if prevline =~ '\<where\>\s\+\S\+.*$' 143 return match(prevline, '\<where\>') + g:idris2_indent_where 144 endif 145 146 if prevline =~ '\<do\>\s\+\S\+.*$' 147 return match(prevline, '\<do\>') + g:idris2_indent_do 148 endif 149 150 if prevline =~ '^\s*\<\(co\)\?data\>\s\+[^=]\+\s\+=\s\+\S\+.*$' 151 return match(prevline, '=') 152 endif 153 154 if prevline =~ '\<with\>\s\+([^)]*)\s*$' 155 return match(prevline, '\S') + &shiftwidth 156 endif 157 158 if prevline =~ '\<case\>\s\+.\+\<of\>\s*$' 159 return match(prevline, '\<case\>') + g:idris2_indent_case 160 endif 161 162 if prevline =~ '^\s*\(\<namespace\>\|\<\(co\)\?data\>\)\s\+\S\+\s*$' 163 return match(prevline, '\(\<namespace\>\|\<\(co\)\?data\>\)') + &shiftwidth 164 endif 165 166 if prevline =~ '^\s*\(\<using\>\|\<parameters\>\)\s*([^(]*)\s*$' 167 return match(prevline, '\(\<using\>\|\<parameters\>\)') + &shiftwidth 168 endif 169 170 if prevline =~ '^\s*\<mutual\>\s*$' 171 return match(prevline, '\<mutual\>') + &shiftwidth 172 endif 173 174 let line = getline(v:lnum) 175 176 if (line =~ '^\s*}\s*' && prevline !~ '^\s*;') 177 return match(prevline, '\S') - &shiftwidth 178 endif 179 180 return match(prevline, '\S') 181 endfunction 182 183 " vim:et:sw=2:sts=2