diff options
author | René 'Necoro' Neumann <necoro@necoro.net> | 2009-12-17 02:54:38 +0100 |
---|---|---|
committer | René 'Necoro' Neumann <necoro@necoro.net> | 2009-12-17 02:54:44 +0100 |
commit | 220f54eba6108ff32c5be06894a3f4da27727a08 (patch) | |
tree | eafc584aefaa91f981b35325ac08733cf04b6ad5 /.vim/indent/haskell.vim | |
parent | b4bdc8a03a7424a81b7a6a1cdbae27733ef8b9e6 (diff) | |
download | dotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.tar.gz dotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.tar.bz2 dotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.zip |
Add haskell indentation to vim.
Diffstat (limited to '.vim/indent/haskell.vim')
-rw-r--r-- | .vim/indent/haskell.vim | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/.vim/indent/haskell.vim b/.vim/indent/haskell.vim new file mode 100644 index 0000000..dc7c649 --- /dev/null +++ b/.vim/indent/haskell.vim @@ -0,0 +1,85 @@ +" Vim indent file +" Language: Haskell +" Author: motemen <motemen@gmail.com> +" Version: 0.1 +" Last Change: 2007-07-25 +" +" 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 = 5 +endif + +setlocal indentexpr=GetHaskellIndent() +setlocal indentkeys=!^F,o,O + +function! GetHaskellIndent() + let line = substitute(getline(getpos('.')[1] - 1), '\t', repeat(' ', &tabstop), 'g') + + if line =~ '[!#$%&*+./<=>?@\\^|~-]$\|\<do$' + return match(line, '\s*where \zs\|\S') + &shiftwidth + endif + + if line =~ '{$' + return match(line, '\s*where \zs\|\S') + &shiftwidth + endif + + if line =~ '^\(instance\|class\).*\&.*where$' + return &shiftwidth + endif + + if line =~ ')$' + let pos = getpos('.') + normal k$ + let paren_end = getpos('.') + normal % + let paren_begin = getpos('.') + call setpos('.', pos) + if paren_begin[1] != paren_end[1] + return paren_begin[2] - 1 + endif + endif + + if line !~ '\<else\>' + let s = match(line, '\<if\>.*\&.*\zs\<then\>') + if s > 0 + return s + endif + + let s = match(line, '\<if\>') + if s > 0 + return s + g:haskell_indent_if + endif + endif + + let s = match(line, '\<do\s\+\zs[^{]\|\<where\s\+\zs\w\|\<let\s\+\zs\S\|^\s*\zs|\s') + if s > 0 + return s + endif + + let s = match(line, '\<case\>') + if s > 0 + return s + g:haskell_indent_case + endif + + return match(line, '\S') +endfunction |