if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1 " indentation for haskell " " Based on idris indentation " " author: raichoo (raichoo@googlemail.com) " " Modify g:haskell_indent_if and g:haskell_indent_case to " change indentation for `if'(default 3) and `case'(default 5). " Example (in .vimrc): " > let g:haskell_indent_if = 2 if exists('b:did_indent') finish endif let b:did_indent = 1 if !exists('g:haskell_indent_if') " if bool " >>>then ... " >>>else ... let g:haskell_indent_if = 3 endif if !exists('g:haskell_indent_case') " case xs of " >>[] -> ... " >>(y:ys) -> ... let g:haskell_indent_case = 2 endif if !exists('g:haskell_indent_let') " let x = 0 in " >>>>x let g:haskell_indent_let = 4 endif if !exists('g:haskell_indent_where') " where f :: Int -> Int " >>>>>>f x = x let g:haskell_indent_where = 6 endif if !exists('g:haskell_indent_do') " do x <- a " >>>y <- b let g:haskell_indent_do = 3 endif if !exists('g:haskell_indent_in') " let x = 1 " >in x let g:haskell_indent_in = 1 endif setlocal indentexpr=GetHaskellIndent() setlocal indentkeys=!^F,o,O,0\|,0=where,0=in,0=let,0=deriving,0=->,0=\=>,,0} function! GetHaskellIndent() let l:prevline = getline(v:lnum - 1) if l:prevline =~ '^\s*--' return match(l:prevline, '\S') endif if synIDattr(synID(line("."), col("."), 1), "name") == 'haskellBlockComment' for l:c in range(v:lnum - 1, 0, -1) let l:bline = getline(l:c) if l:bline =~ '{-' return 1 + match(l:bline, '{-') endfor return 1 endif if l:prevline =~ '^\s*$' return 0 endif let l:line = getline(v:lnum) if l:line =~ '\C^\s*\' let l:s = match(l:prevline, '\S') return l:s + &shiftwidth endif if l:line =~ '\C^\s*\' let l:s = match(l:prevline, '\C\<\(newtype\|data\)\>') if l:s >= 0 return l:s + &shiftwidth endif endif if l:line =~ '\C^\s*\' let l:s = match(l:prevline, '\C\') if l:s != 0 return l:s endif endif if l:line =~ '\C^\s*\' let l:s = match(l:prevline, '\C\') if l:s >= 0 return l:s + g:haskell_indent_in elseif match(l:prevline, '=') > 0 let l:s = match(l:prevline, '\S') return l:s - (4 - g:haskell_indent_in) endif endif if l:line =~ '^\s*|' if match(l:prevline, '^\s*data') < 0 if match(l:prevline, '^\s*|\s') >= 0 return match(l:prevline, '|') else return &shiftwidth endif endif endif if l:line =~ '^\s*[=-]>' let l:s = match(l:prevline, ' :: ') if l:s >= 0 return l:s + 1 endif endif if l:prevline =~ '\s\+[!#$%&*+./<>?@\\^|~-]\+\s*$' let l:s = match(l:prevline, '\S') if l:s > 0 return l:s + &shiftwidth endif endif if l:prevline =~ '[{([][^})\]]\+$' return match(l:prevline, '[{([]') endif if l:prevline =~ '\C\\s\+[^=]\+=\s*$' return match(l:prevline, '\C\') + g:haskell_indent_let + &shiftwidth endif if l:prevline =~ '\C\\s\+.\+\(\\)\?\s*$' return match(l:prevline, '\C\') + g:haskell_indent_let endif if l:prevline !~ '\C\' let l:s = match(l:prevline, '\C\.*\&.*\zs\') if l:s > 0 return l:s endif let l:s = match(l:prevline, '\C\') if l:s > 0 return l:s + g:haskell_indent_if endif endif if l:prevline =~ '\C\(\\|\\|=\|[{([]\)\s*$' return match(l:prevline, '\S') + &shiftwidth endif if l:prevline =~ '\C\\s\+\S\+.*$' return match(l:prevline, '\C\') + g:haskell_indent_where endif if l:prevline =~ '\C\\s\+\S\+.*$' return match(l:prevline, '\C\') + g:haskell_indent_do endif if l:prevline =~ '\C^\s*\\s\+[^=]\+\s\+=\s\+\S\+.*$' if l:line =~ '^\s*|' return match(l:prevline, '=') endif endif if l:prevline =~ '\C\\s\+.\+\\s*$' return match(l:prevline, '\C\') + g:haskell_indent_case endif if l:prevline =~ '\C^\s*\<\data\>\s\+\S\+\s*$' return match(l:prevline, '\C\') + &shiftwidth endif return match(l:prevline, '\S') endfunction endif