summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2015-12-06 11:53:26 +0100
committerAdam Stankiewicz <sheerun@sher.pl>2015-12-06 11:53:26 +0100
commit08ea94e01188531e819e5d6bea5c84a773b4eb98 (patch)
tree595c73c1476e2fdc8458529907efea083a405f68 /indent
parentba7a783c7f3d3c923ef151e4d3e99e087831ef69 (diff)
downloadvim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.tar.gz
vim-polyglot-08ea94e01188531e819e5d6bea5c84a773b4eb98.zip
Add elm support, closes #81
Diffstat (limited to 'indent')
-rw-r--r--indent/elm.vim129
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