diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2015-12-06 11:53:26 +0100 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2015-12-06 11:53:26 +0100 |
commit | 08ea94e01188531e819e5d6bea5c84a773b4eb98 (patch) | |
tree | 595c73c1476e2fdc8458529907efea083a405f68 /indent | |
parent | ba7a783c7f3d3c923ef151e4d3e99e087831ef69 (diff) | |
download | vim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.tar.gz vim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.zip |
Add elm support, closes #81
Diffstat (limited to 'indent')
-rw-r--r-- | indent/elm.vim | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/indent/elm.vim b/indent/elm.vim new file mode 100644 index 00000000..48e96d7e --- /dev/null +++ b/indent/elm.vim @@ -0,0 +1,129 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1 + +" Vim indent file +" Language: Haskell +" Maintainer: lilydjwg <lilydjwg@gmail.com> +" Version: 1.0 +" References: http://en.wikibooks.org/wiki/Haskell/Indentation +" http://book.realworldhaskell.org/read/ +" See Also: The Align plugin http://www.vim.org/scripts/script.php?script_id=294 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal indentexpr=HaskellIndent() +for i in split('0{,:,0#,e', ',') + exec "setlocal indentkeys-=" . i +endfor +setlocal indentkeys+=0=else,0=in,0=where,0),0<bar> +setlocal tabstop=8 +setlocal expandtab + +if !exists('g:Haskell_no_mapping') + inoremap <silent> <BS> <C-R>=<SID>HaskellDedent(1)<CR> + inoremap <silent> <C-D> <C-R>=<SID>HaskellDedent(0)<CR> +endif + +" Only define the functions once. +if exists("*HaskellIndent") + finish +endif + +let s:align_map = { + \ 'in': '\<let\>', + \ '\<else\>': '\<then\>', + \ ',': '\v%(\s|\w|^)@<=[[{]%(\s|\w|"|$)@=' + \ } +let s:indent_self = ['='] +let s:indent_next = ['let', 'in', 'where', 'do', 'if'] +let s:indent_if_final = ['=', 'do', '->', 'of', 'where'] + +function HaskellIndent() + let lnum = v:lnum - 1 + + " Hit the start of the file, use zero indent. + if lnum == 0 + return 0 + endif + + let ind = indent(lnum) + let prevline = getline(lnum) + let curline = getline(v:lnum) + let curwords = split(curline) + if len(curwords) > 0 + if has_key(s:align_map, curwords[0]) + let word = s:align_map[curwords[0]] + let m = -1 + let line = v:lnum + while m == -1 + let line -= 1 + if line <= 0 + return -1 + endif + let m = match(getline(line), word) + endwhile + return m + elseif index(s:indent_self, curwords[0]) != -1 + return ind + &sw + elseif curwords[0] == '|' + return match(prevline, '\v%(\s|\w|^)@<=[|=]%(\s|\w)@=') + elseif index([')', '}'], curwords[0]) != -1 + return ind - &sw + elseif curwords[0] == 'where' + if prevline =~ '\v^\s+\|%(\s|\w)@=' + return ind - 1 + endif + endif + endif + + let prevwords = split(prevline) + if len(prevwords) == 0 + return 0 + endif + + if prevwords[-1] == 'where' && prevwords[0] == 'module' + return 0 + elseif index(s:indent_if_final, prevwords[-1]) != -1 + return ind + &sw + elseif prevwords[-1] =~ '\v%(\s|\w|^)@<=[[{(]$' + return ind + &sw + else + for word in reverse(prevwords) + if index(s:indent_next, word) != -1 + return match(prevline, '\<'.word.'\>') + len(word) + 1 + endif + endfor + endif + + if len(curwords) > 0 && curwords[0] == 'where' + return ind + &sw + endif + + return ind +endfunction + +function s:HaskellDedent(isbs) + if a:isbs && strpart(getline('.'), 0, col('.')-1) !~ '^\s\+$' + return "\<BS>" + endif + + let curind = indent('.') + let line = line('.') - 1 + while curind > 0 && line > 0 + let ind = indent(line) + if ind >= curind + let line -= 1 + else + echomsg curind ind + call setline('.', repeat(' ', ind) . + \ substitute(getline('.'), '^\s\+', '', '')) + return '' + endif + endwhile + return a:isbs ? "\<BS>" : '' +endfunction + +endif |