summaryrefslogtreecommitdiff
path: root/.vim/indent
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2009-12-17 02:54:38 +0100
committerRené 'Necoro' Neumann <necoro@necoro.net>2009-12-17 02:54:44 +0100
commit220f54eba6108ff32c5be06894a3f4da27727a08 (patch)
treeeafc584aefaa91f981b35325ac08733cf04b6ad5 /.vim/indent
parentb4bdc8a03a7424a81b7a6a1cdbae27733ef8b9e6 (diff)
downloaddotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.tar.gz
dotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.tar.bz2
dotfiles-220f54eba6108ff32c5be06894a3f4da27727a08.zip
Add haskell indentation to vim.
Diffstat (limited to '.vim/indent')
-rw-r--r--.vim/indent/haskell.vim85
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