vim-polyglot/indent/purescript.vim
2016-05-02 11:35:06 +02:00

142 lines
2.9 KiB
VimL

if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'purescript') == -1
" indentation for purescript
"
" Based on idris indentation
"
" author: raichoo (raichoo@googlemail.com)
"
" Modify g:purescript_indent_if and g:purescript_indent_case to
" change indentation for `if'(default 3) and `case'(default 5).
" Example (in .vimrc):
" > let g:purescript_indent_if = 2
if exists('b:did_indent')
finish
endif
let b:did_indent = 1
if !exists('g:purescript_indent_if')
" if bool
" >>>then ...
" >>>else ...
let g:purescript_indent_if = 3
endif
if !exists('g:purescript_indent_case')
" case xs of
" >>>>>[] -> ...
" >>>>>(y:ys) -> ...
let g:purescript_indent_case = 5
endif
if !exists('g:purescript_indent_let')
" let x = 0 in
" >>>>x
let g:purescript_indent_let = 4
endif
if !exists('g:purescript_indent_where')
" where f :: Int -> Int
" >>>>>>f x = x
let g:purescript_indent_where = 6
endif
if !exists('g:purescript_indent_do')
" do x <- a
" >>>y <- b
let g:purescript_indent_do = 3
endif
setlocal indentexpr=GetPurescriptIndent()
setlocal indentkeys=!^F,o,O,},=where,=in
function! GetPurescriptIndent()
let prevline = getline(v:lnum - 1)
let line = getline(v:lnum)
if line =~ '^\s*\<where\>'
let s = match(prevline, '\S')
return s + 2
endif
if line =~ '^\s*\<in\>'
let n = v:lnum
let s = 0
while s <= 0 && n > 0
let n = n - 1
let s = match(getline(n),'\<let\>')
endwhile
return s + 1
endif
if prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$'
let s = match(prevline, '=')
if s > 0
return s + 2
endif
let s = match(prevline, ':')
if s > 0
return s + 3
else
return match(prevline, '\S')
endif
endif
if prevline =~ '[{([][^})\]]\+$'
return match(prevline, '[{([]')
endif
if prevline =~ '\<let\>\s\+.\+\(\<in\>\)\?\s*$'
return match(prevline, '\<let\>') + g:purescript_indent_let
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:purescript_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:purescript_indent_where
endif
if prevline =~ '\<do\>\s\+\S\+.*$'
return match(prevline, '\<do\>') + g:purescript_indent_do
endif
if prevline =~ '^\s*\<data\>\s\+[^=]\+\s\+=\s\+\S\+.*$'
return match(prevline, '=')
endif
if prevline =~ '\<case\>\s\+.\+\<of\>\s*$'
return match(prevline, '\<case\>') + g:purescript_indent_case
endif
if prevline =~ '^\s*\<\data\>\s\+\S\+\s*$'
return match(prevline, '\<data\>') + &shiftwidth
endif
if (line =~ '^\s*}\s*' && prevline !~ '^\s*;')
return match(prevline, '\S') - &shiftwidth
endif
return match(prevline, '\S')
endfunction
endif