diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2016-05-02 10:42:37 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2016-05-02 10:42:37 +0200 |
commit | 5dd1a7e83966c92d220073185f1738dfe441f59e (patch) | |
tree | 9c4bee389a51a9bb111dcc894c9db0f6d1809d81 /indent | |
parent | bc098370c1bb81840734f5764f431dee270e75ce (diff) | |
download | vim-polyglot-5dd1a7e83966c92d220073185f1738dfe441f59e.tar.gz vim-polyglot-5dd1a7e83966c92d220073185f1738dfe441f59e.zip |
Update
Diffstat (limited to 'indent')
-rw-r--r-- | indent/blade.vim | 21 | ||||
-rw-r--r-- | indent/cucumber.vim | 19 | ||||
-rw-r--r-- | indent/elixir.vim | 73 | ||||
-rw-r--r-- | indent/gitconfig.vim | 7 | ||||
-rw-r--r-- | indent/gohtmltmpl.vim | 39 | ||||
-rw-r--r-- | indent/haml.vim | 5 | ||||
-rw-r--r-- | indent/haskell.vim | 402 | ||||
-rw-r--r-- | indent/html.vim | 38 | ||||
-rw-r--r-- | indent/liquid.vim | 9 | ||||
-rw-r--r-- | indent/pug.vim (renamed from indent/jade.vim) | 18 | ||||
-rw-r--r-- | indent/ruby.vim | 2 | ||||
-rw-r--r-- | indent/sass.vim | 4 |
12 files changed, 493 insertions, 144 deletions
diff --git a/indent/blade.vim b/indent/blade.vim index 78a8a78c..4c89ed61 100644 --- a/indent/blade.vim +++ b/indent/blade.vim @@ -13,7 +13,7 @@ let b:did_indent = 1 setlocal autoindent setlocal indentexpr=GetBladeIndent() -setlocal indentkeys=o,O,*<Return>,<>>,!^F,=@else,=@end,=@empty +setlocal indentkeys=o,O,*<Return>,<>>,!^F,=@else,=@end,=@empty,=@show " Only define the function once. if exists("*GetBladeIndent") @@ -30,17 +30,26 @@ function! GetBladeIndent() let cline = substitute(substitute(getline(v:lnum), '\s\+$', '', ''), '^\s\+', '', '') let indent = indent(lnum) let cindent = indent(v:lnum) - if cline =~# '@\%(else\|elseif\|empty\|end\)' - let indent = cindent < indent ? cindent : indent - &sw - elseif HtmlIndent() > -1 - let indent = HtmlIndent() + if cline =~# '@\%(else\|elseif\|empty\|end\|show\)' + let indent = indent - &sw + else + if exists("*GetBladeIndentCustom") + let hindent = GetBladeIndentCustom() + else + let hindent = HtmlIndent() + endif + if hindent > -1 + let indent = hindent + endif endif let increase = indent + &sw if indent = indent(lnum) let indent = cindent <= indent ? -1 : increase endif - if line =~# '@\%(if\|elseif\|else\|unless\|foreach\|forelse\|for\|while\)\%(.*\s*@end\)\@!' + if line =~# '@\%(section\)\%(.*\s*@end\)\@!' && line !~# '@\%(section\)\s*([^,]*)' + return indent + elseif line =~# '@\%(if\|elseif\|else\|unless\|foreach\|forelse\|for\|while\|empty\|push\|section\|can\)\%(.*\s*@end\)\@!' return increase else return indent diff --git a/indent/cucumber.vim b/indent/cucumber.vim index 5e646a51..03f11dc8 100644 --- a/indent/cucumber.vim +++ b/indent/cucumber.vim @@ -29,6 +29,7 @@ function! GetCucumberIndent() let line = getline(prevnonblank(v:lnum-1)) let cline = getline(v:lnum) let nline = getline(nextnonblank(v:lnum+1)) + let sw = exists('*shiftwidth') ? shiftwidth() : &sw let syn = s:syn(prevnonblank(v:lnum-1)) let csyn = s:syn(v:lnum) let nsyn = s:syn(nextnonblank(v:lnum+1)) @@ -37,38 +38,38 @@ function! GetCucumberIndent() return 0 elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):' " examples heading - return 2 * &sw + return 2 * sw elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' " background, scenario or outline heading - return &sw + return sw elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:' " line after feature heading - return &sw + return sw elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):' " line after examples heading - return 3 * &sw + return 3 * sw elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' " line after background, scenario or outline heading - return 2 * &sw + return 2 * sw elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0) " tag or comment before a feature heading return 0 elseif cline =~# '^\s*@' " other tags - return &sw + return sw elseif cline =~# '^\s*[#|]' && line =~# '^\s*|' " mid-table " preserve indent return indent(prevnonblank(v:lnum-1)) elseif cline =~# '^\s*|' && line =~# '^\s*[^|]' " first line of a table, relative indent - return indent(prevnonblank(v:lnum-1)) + &sw + return indent(prevnonblank(v:lnum-1)) + sw elseif cline =~# '^\s*[^|]' && line =~# '^\s*|' " line after a table, relative unindent - return indent(prevnonblank(v:lnum-1)) - &sw + return indent(prevnonblank(v:lnum-1)) - sw elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && (nsyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || nline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):') " comments on scenarios - return &sw + return sw endif return indent(prevnonblank(v:lnum-1)) endfunction diff --git a/indent/elixir.vim b/indent/elixir.vim index 58179973..7ccaea12 100644 --- a/indent/elixir.vim +++ b/indent/elixir.vim @@ -17,16 +17,18 @@ endif let s:cpo_save = &cpo set cpo&vim -let s:no_colon_before = ':\@<!' -let s:no_colon_after = ':\@!' -let s:symbols_end = '\]\|}' -let s:arrow = '^.*->$' -let s:pipeline = '^\s*|>.*$' -let s:skip_syntax = '\%(Comment\|String\)$' -let s:block_skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:skip_syntax."'" -let s:block_start = 'do\|fn' -let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue' -let s:block_end = 'end' +let s:no_colon_before = ':\@<!' +let s:no_colon_after = ':\@!' +let s:symbols_end = '\]\|}\|)' +let s:symbols_start = '\[\|{\|(' +let s:arrow = '^.*->$' +let s:skip_syntax = '\%(Comment\|String\)$' +let s:block_skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:skip_syntax."'" +let s:block_start = '\<\%(do\|fn\)\>' +let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue' +let s:block_end = 'end' +let s:starts_with_pipeline = '^\s*|>.*$' +let s:ending_with_assignment = '=\s*$' let s:indent_keywords = '\<'.s:no_colon_before.'\%('.s:block_start.'\|'.s:block_middle.'\)$'.'\|'.s:arrow let s:deindent_keywords = '^\s*\<\%('.s:block_end.'\|'.s:block_middle.'\)\>'.'\|'.s:arrow @@ -35,15 +37,21 @@ let s:pair_start = '\<\%('.s:no_colon_before.s:block_start.'\)\>'.s:no_colon_af let s:pair_middle = '\<\%('.s:block_middle.'\)\>'.s:no_colon_after.'\zs' let s:pair_end = '\<\%('.s:no_colon_before.s:block_end.'\)\>\zs' +let s:inside_block = 0 + function! GetElixirIndent() let lnum = prevnonblank(v:lnum - 1) - let ind = indent(lnum) " At the start of the file use zero indent. if lnum == 0 return 0 endif + let opened_symbol = 0 + let current_line = getline(v:lnum) + let last_line = getline(lnum) + let ind = indent(lnum) + " TODO: Remove these 2 lines " I don't know why, but for the test on spec/indent/lists_spec.rb:24. " Vim is making some mess on parsing the syntax of 'end', it is being @@ -53,15 +61,22 @@ function! GetElixirIndent() syntax sync fromstart if synIDattr(synID(v:lnum, 1, 1), "name") !~ s:skip_syntax - let current_line = getline(v:lnum) - let last_line = getline(lnum) - let splited_line = split(last_line, '\zs') - let opened_symbol = 0 - let opened_symbol += count(splited_line, '[') - count(splited_line, ']') - let opened_symbol += count(splited_line, '{') - count(splited_line, '}') - - let ind += (opened_symbol * &sw) + if last_line !~ s:arrow + let split_line = split(last_line, '\zs') + let opened_symbol += count(split_line, '(') - count(split_line, ')') + let opened_symbol += count(split_line, '[') - count(split_line, ']') + let opened_symbol += count(split_line, '{') - count(split_line, '}') + end + + " if start symbol is followed by a character, indent based on the + " whitespace after the symbol, otherwise use the default shiftwidth + if last_line =~ '\('.s:symbols_start.'\).' + let opened_prefix = matchlist(last_line, '\('.s:symbols_start.'\)\s*')[0] + let ind += (opened_symbol * strlen(opened_prefix)) + else + let ind += (opened_symbol * &sw) + endif if last_line =~ '^\s*\('.s:symbols_end.'\)' || last_line =~ s:indent_keywords let ind += &sw @@ -71,27 +86,35 @@ function! GetElixirIndent() let ind -= &sw endif + if last_line =~ s:ending_with_assignment && opened_symbol == 0 + let b:old_ind = indent(lnum) + let ind += &sw + end + " if line starts with pipeline - " and last line contains pipeline(s) + " and last line ends with a pipeline, " align them if last_line =~ '|>.*$' && - \ current_line =~ s:pipeline + \ current_line =~ s:starts_with_pipeline let ind = float2nr(match(last_line, '|>') / &sw) * &sw " if line starts with pipeline " and last line is an attribution " indents pipeline in same level as attribution - elseif current_line =~ s:pipeline && + elseif current_line =~ s:starts_with_pipeline && \ last_line =~ '^[^=]\+=.\+$' - let b:old_ind = ind + + if !exists('b:old_ind') || b:old_ind == 0 + let b:old_ind = indent(lnum) + end let ind = float2nr(matchend(last_line, '=\s*[^ ]') / &sw) * &sw endif " if last line starts with pipeline " and current line doesn't start with pipeline " returns the indentation before the pipeline - if last_line =~ s:pipeline && - \ current_line !~ s:pipeline + if last_line =~ s:starts_with_pipeline && + \ current_line !~ s:starts_with_pipeline let ind = b:old_ind endif diff --git a/indent/gitconfig.vim b/indent/gitconfig.vim index 6fc4ba33..e0e4a456 100644 --- a/indent/gitconfig.vim +++ b/indent/gitconfig.vim @@ -22,17 +22,18 @@ if exists("*GetGitconfigIndent") endif function! GetGitconfigIndent() + let sw = exists('*shiftwidth') ? shiftwidth() : &sw let line = getline(prevnonblank(v:lnum-1)) let cline = getline(v:lnum) if line =~ '\\\@<!\%(\\\\\)*\\$' " odd number of slashes, in a line continuation - return 2 * &sw + return 2 * sw elseif cline =~ '^\s*\[' return 0 elseif cline =~ '^\s*\a' - return &sw + return sw elseif cline == '' && line =~ '^\[' - return &sw + return sw else return -1 endif diff --git a/indent/gohtmltmpl.vim b/indent/gohtmltmpl.vim index 7275383e..e1708552 100644 --- a/indent/gohtmltmpl.vim +++ b/indent/gohtmltmpl.vim @@ -6,4 +6,43 @@ endif runtime! indent/html.vim +" Indent Golang HTML templates +setlocal indentexpr=GetGoHTMLTmplIndent(v:lnum) +setlocal indentkeys+==else,=end + +" Only define the function once. +if exists("*GetGoHTMLTmplIndent") + finish +endif + +function! GetGoHTMLTmplIndent(lnum) + " Get HTML indent + if exists('*HtmlIndent') + let ind = HtmlIndent() + else + let ind = HtmlIndentGet(a:lnum) + endif + + " The value of a single shift-width + if exists('*shiftwidth') + let sw = shiftwidth() + else + let sw = &sw + endif + + " If need to indent based on last line + let last_line = getline(a:lnum-1) + if last_line =~ '^\s*{{\s*\%(if\|else\|range\|with\|define\|block\).*}}' + let ind += sw + endif + + " End of FuncMap block + let current_line = getline(a:lnum) + if current_line =~ '^\s*{{\s*\%(else\|end\).*}}' + let ind -= sw + endif + + return ind +endfunction + endif diff --git a/indent/haml.vim b/indent/haml.vim index e6e04181..c251a4c4 100644 --- a/indent/haml.vim +++ b/indent/haml.vim @@ -39,10 +39,11 @@ function! GetHamlIndent() let line = substitute(line,'^\s\+','','') let indent = indent(lnum) let cindent = indent(v:lnum) + let sw = exists('*shiftwidth') ? shiftwidth() : &sw if cline =~# '\v^-\s*%(elsif|else|when)>' - let indent = cindent < indent ? cindent : indent - &sw + let indent = cindent < indent ? cindent : indent - sw endif - let increase = indent + &sw + let increase = indent + sw if indent == indent(lnum) let indent = cindent <= indent ? -1 : increase endif diff --git a/indent/haskell.vim b/indent/haskell.vim index b69a19c2..b72ee23d 100644 --- a/indent/haskell.vim +++ b/indent/haskell.vim @@ -2,8 +2,6 @@ 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 @@ -18,7 +16,7 @@ endif let b:did_indent = 1 if !exists('g:haskell_indent_if') - " if bool + " if x " >>>then ... " >>>else ... let g:haskell_indent_if = 3 @@ -55,96 +53,130 @@ if !exists('g:haskell_indent_in') 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=\=>,<CR>,0} - -function! GetHaskellIndent() - let l:prevline = getline(v:lnum - 1) +if !exists('g:haskell_indent_guard') + " f x y + " >>| + let g:haskell_indent_guard = 2 +endif - if l:prevline =~ '^\s*--' - return match(l:prevline, '\S') - endif +setlocal indentexpr=GetHaskellIndent() +setlocal indentkeys=0{,0},0(,0),0[,0],!^F,o,O,0\=,0=where,0=let,0=deriving,0\,,<space> - 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 +function! s:isInBlock(hlstack) + return index(a:hlstack, 'haskellParens') > -1 || index(a:hlstack, 'haskellBrackets') > -1 || index(a:hlstack, 'haskellBlock') > -1 +endfunction - if l:prevline =~ '^\s*$' - return 0 - endif +function! s:getNesting(hlstack) + return filter(a:hlstack, 'v:val == "haskellBlock" || v:val == "haskellBrackets" || v:val == "haskellParens"') +endfunction - let l:line = getline(v:lnum) +function! s:getHLStack() + return map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') +endfunction - if l:line =~ '\C^\s*\<where\>' - let l:s = match(l:prevline, '\S') - return l:s + &shiftwidth - endif +" indent matching character +function! s:indentMatching(char) + normal! 0 + call search(a:char, 'cW') + normal! % + return col('.') - 1 +endfunction - if l:line =~ '\C^\s*\<deriving\>' - let l:s = match(l:prevline, '\C\<\(newtype\|data\)\>') - if l:s >= 0 - return l:s + &shiftwidth +" backtrack to find guard clause +function! s:indentGuard(pos, prevline) + let l:l = a:prevline + let l:c = 1 + + while v:lnum != l:c + " empty line, stop looking + if l:l =~ '^$' + return a:pos + " guard found + elseif l:l =~ '^\s*|\s\+' + return match(l:l, '|') + " found less deeper indentation (not starting with `,` or `=`) + " stop looking + else + let l:m = match(l:l, '\S') + if l:l !~ '^\s*[=,]' && l:m <= a:pos + return l:m + g:haskell_indent_guard + endif endif - endif + let l:c += 1 + let l:l = getline(v:lnum - l:c) + endwhile - if l:line =~ '\C^\s*\<let\>' - let l:s = match(l:prevline, '\C\<let\>') - if l:s != 0 - return l:s - endif - endif + return -1 +endfunction - if l:line =~ '\C^\s*\<in\>' - let l:s = match(l:prevline, '\C\<let\>') - 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 +function! GetHaskellIndent() + let l:hlstack = s:getHLStack() + + " do not indent in strings and quasiquotes + if index(l:hlstack, 'haskellString') > -1 || index(l:hlstack, 'haskellQuasiQuote') > -1 + return -1 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 + " blockcomment handling + if index(l:hlstack, 'haskellBlockComment') > -1 + for l:c in range(v:lnum - 1, 0, -1) + let l:line = getline(l:c) + if l:line =~ '{-' + return 1 + match(l:line, '{-') endif - endif + endfor + return 1 endif - if l:line =~ '^\s*[=-]>' - let l:s = match(l:prevline, ' :: ') - if l:s >= 0 - return l:s + 1 - endif + let l:prevline = getline(v:lnum - 1) + let l:line = getline(v:lnum) + + " reset + if l:prevline =~ '^\s*$' && l:line !~ '^\s*\S' + return 0 endif - if l:prevline =~ '\s\+[!#$%&*+./<>?@\\^|~-]\+\s*$' - let l:s = match(l:prevline, '\S') - if l:s > 0 - return l:s + &shiftwidth - endif + " comment indentation + if l:prevline =~ '^\s*--' + return match(l:prevline, '\S') endif - if l:prevline =~ '[{([][^})\]]\+$' - return match(l:prevline, '[{([]') + " operator at end of previous line + if l:prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$' + return match(l:prevline, '\S') + &shiftwidth endif + " let foo = + " >>>>>>bar if l:prevline =~ '\C\<let\>\s\+[^=]\+=\s*$' return match(l:prevline, '\C\<let\>') + g:haskell_indent_let + &shiftwidth endif - if l:prevline =~ '\C\<let\>\s\+.\+\(\<in\>\)\?\s*$' + " let x = 1 in + " >>>>x + if l:prevline =~ '\C\<let\>\s\+.\+\<in\>\?$' && l:line !~ '\C^\s*\<in\>' return match(l:prevline, '\C\<let\>') + g:haskell_indent_let endif + " let x = 1 + " let y = 2 + " + " let x = 1 + " >in x + " + " let x = 1 + " >>>>y = 2 + if l:prevline =~ '\C\<let\>\s\+.\+$' + if l:line =~ '\C^\s*\<let\>' + return match(l:prevline, '\C\<let\>') + elseif l:line =~ '\C^\s*\<in\>' + return match(l:prevline, '\C\<let\>') + g:haskell_indent_in + else + return match(l:prevline, '\C\<let\>') + g:haskell_indent_let + endif + endif + + " if handling if l:prevline !~ '\C\<else\>' let l:s = match(l:prevline, '\C\<if\>.*\&.*\zs\<then\>') if l:s > 0 @@ -157,30 +189,252 @@ function! GetHaskellIndent() endif endif - if l:prevline =~ '\C\(\<where\>\|\<do\>\|=\|[{([]\)\s*$' + " where + " >>foo + " + " do + " >>foo + " + " foo = + " >>bar + if l:prevline =~ '\C\(\<where\>\|\<do\>\|=\)\s*$' return match(l:prevline, '\S') + &shiftwidth endif + "" where foo + "" >>>>>>bar if l:prevline =~ '\C\<where\>\s\+\S\+.*$' - return match(l:prevline, '\C\<where\>') + g:haskell_indent_where + if l:line =~ '^\s*[=-]>\s' && l:prevline =~ ' :: ' + return match(l:prevline, ':: ') + else + return match(l:prevline, '\C\<where\>') + g:haskell_indent_where + endif endif + " do foo + " >>>bar if l:prevline =~ '\C\<do\>\s\+\S\+.*$' return match(l:prevline, '\C\<do\>') + g:haskell_indent_do endif - if l:prevline =~ '\C^\s*\<data\>\s\+[^=]\+\s\+=\s\+\S\+.*$' - if l:line =~ '^\s*|' + " case foo of + " >>bar -> quux + if l:prevline =~ '\C\<case\>.\+\<of\>\s*$' + return match(l:prevline, '\C\<case\>') + g:haskell_indent_case + endif + + " newtype Foo = Foo + " >>deriving + if l:prevline =~ '\C\s*\<\(newtype\|data\)\>[^{]\+' && l:line =~ '\C^\s*\<deriving\>' + return match(l:prevline, '\S') + &shiftwidth + endif + + " foo :: Int + " >>>>-> Int + " + " foo + " :: Int + " foo + if l:prevline =~ '\s::\s' + if l:line =~ '^\s*[-=]>' + return match(l:prevline, '::\s') + elseif match(l:prevline, '^\s\+::') > -1 + return match(l:prevline, '::\s') - &shiftwidth + endif + endif + + " foo :: Int + " -> Int + " foo x + " + " foo + " :: Int + " -> Int + " foo x + if l:prevline =~ '^\s*[-=]>' && l:line !~ '^\s*[-=]>' + if s:isInBlock(l:hlstack) + return match(l:prevline, '[^\s-=>]') + else + let l:m = matchstr(l:line, '^\s*\zs\<\S\+\>\ze') + let l:l = l:prevline + let l:c = 1 + + while v:lnum != l:c + " fun decl + let l:s = match(l:l, l:m) + if l:s >= 0 + if match(l:l, '\C^\s*\<default\>') > -1 + return l:s - 8 + else + return l:s + endif + " empty line, stop looking + elseif l:l =~ '^$' + return 0 + endif + let l:c += 1 + let l:l = getline(v:lnum - l:c) + endwhile + + return 0 + endif + endif + + " | otherwise = ... + " foo + " + " | foo + " >>, bar + " + " | foo + " >>= bar + " + " | Foo + " >>deriving + if l:prevline =~ '^\s\+|' && !s:isInBlock(l:hlstack) + if l:line =~ '\s*[,=]' + return match(l:prevline, '|') + elseif l:line =~ '\C^\s*\<deriving\>' + return match(l:prevline, '|') + elseif l:line !~ '^\s*|' + return match(l:prevline, '|') - g:haskell_indent_guard + endif + endif + + " foo :: ( Monad m + " , Functor f + " ) + ">>>>>=> Int + if l:prevline =~ '^\s*)' && l:line =~ '^\s*=>' + let l:s = match(l:prevline, ')') + return l:s - (&shiftwidth + 1) + endif + + " module Foo + " >>( bar + if l:prevline =~ '\C^\<module\>' + return &shiftwidth + endif + + " foo + " >>{ + if l:line =~ '^\s*{' && l:prevline !~ '^{' + return match(l:prevline, '\S') + &shiftwidth + endif + + " in foo + " where bar + if l:line =~ '\C^\s*\<where\>' + if match(l:prevline, '\C^\s\+in\s\+') == 0 + return match(l:prevline, 'in') - g:haskell_indent_in + endif + + return match(l:prevline, '\S') + &shiftwidth + endif + + " let x = 1 + " y = 2 + " >in x + 1 + if l:line =~ '\C^\s*\<in\>' + return match(l:prevline, '\S') - (4 - g:haskell_indent_in) + endif + + " data Foo + " >>= Bar + " + " | + " ... + " >>= + " + " foo + " >>= + if l:line =~ '^\s*=' + if l:prevline =~ '\C^\<data\>\s\+[^=]\+\s*$' + return match(l:prevline, '\C\<data\>') + &shiftwidth + else + let l:s = s:indentGuard(match(l:line, '='), l:prevline) + if l:s > 0 + return l:s + else + return &shiftwidth + endif + endif + endif + + " { foo :: Int + " >>, + " + " | + " ... + " >>, + if l:line =~ '^\s*,' + if s:isInBlock(l:hlstack) + normal! 0 + call search(',', 'cW') + let l:n = s:getNesting(s:getHLStack()) + call search('[(\[{]', 'bW') + + while l:n != s:getNesting(s:getHLStack()) + call search('[(\[{]', 'bW') + endwhile + + return col('.') - 1 + else + let l:s = s:indentGuard(match(l:line, ','), l:prevline) + if l:s > -1 + return l:s + end + endif + endif + + " | + " ... + " >>| + " + " data Foo = Bar + " >>>>>>>>>| + if l:line =~ '^\s*|\s' + if l:prevline =~ '\C^\s*\<data\>.\+=.\+$' return match(l:prevline, '=') + else + let l:s = s:indentGuard(match(l:line, '|'), l:prevline) + if l:s > -1 + return l:s + endif endif endif - if l:prevline =~ '\C\<case\>\s\+.\+\<of\>\s*$' - return match(l:prevline, '\C\<case\>') + g:haskell_indent_case + " foo + " >>:: Int + if l:line =~ '^\s*::\s' + return match(l:prevline, '\S') + &shiftwidth + endif + + " indent closing brace, paren or bracket + if l:line =~ '^\s*}' + return s:indentMatching('}') + endif + + if l:line =~ '^\s*)' + return s:indentMatching(')') + endif + + if l:line =~ '^\s*]' + return s:indentMatching(']') + endif + " + " indent import + if l:line =~ '\C^\s*import' + return 0 + endif + + " do not reindent indented lines + if match(l:prevline, '\S') < match(l:line, '\S') + return -1 endif - if l:prevline =~ '\C^\s*\<\data\>\s\+\S\+\s*$' - return match(l:prevline, '\C\<data\>') + &shiftwidth + if l:line !~ '^\s*[=-]>\s' && l:line =~ '^\s*[!#$%&*+./<>?@\\^|~-]\+' + return -1 endif return match(l:prevline, '\S') diff --git a/indent/html.vim b/indent/html.vim index a09df409..18c5bf15 100644 --- a/indent/html.vim +++ b/indent/html.vim @@ -177,7 +177,24 @@ call add(s:tags, 'tr') call add(s:tags, 'th') call add(s:tags, 'td') - +let s:no_tags = [] + +call add(s:no_tags, 'base') +call add(s:no_tags, 'link') +call add(s:no_tags, 'meta') +call add(s:no_tags, 'hr') +call add(s:no_tags, 'br') +call add(s:no_tags, 'wbr') +call add(s:no_tags, 'img') +call add(s:no_tags, 'embed') +call add(s:no_tags, 'param') +call add(s:no_tags, 'source') +call add(s:no_tags, 'track') +call add(s:no_tags, 'area') +call add(s:no_tags, 'col') +call add(s:no_tags, 'input') +call add(s:no_tags, 'keygen') +call add(s:no_tags, 'menuitem') let s:omittable = [ \ ['address', 'article', 'aside', 'blockquote', 'dir', 'div', 'dl', 'fieldset', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'], @@ -187,16 +204,21 @@ let s:omittable = [ \ ['th', 'td'], \] + +let s:html_noindent_tags = join(s:no_tags, '\|') + if exists('g:html_exclude_tags') for tag in g:html_exclude_tags call remove(s:tags, index(s:tags, tag)) endfor + let s:html_noindent_tags = s:html_noindent_tags.'\|'.join(g:html_exclude_tags, '\|') endif -let s:html_indent_tags = join(s:tags, '\|') -let s:html_indent_tags = s:html_indent_tags.'\|\w\+\(-\w\+\)\+' -if exists('g:html_indent_tags') - let s:html_indent_tags = s:html_indent_tags.'\|'.g:html_indent_tags -endif + +" let s:html_indent_tags = join(s:tags, '\|') +let s:html_indent_tags = '[a-z_][a-z0-9_.-]*' +" if exists('g:html_indent_tags') + " let s:html_indent_tags = s:html_indent_tags.'\|'.g:html_indent_tags +" endif let s:cpo_save = &cpo set cpo-=C @@ -231,8 +253,8 @@ endfun fun! <SID>HtmlIndentSum(lnum, style) if a:style == match(getline(a:lnum), '^\s*</') if a:style == match(getline(a:lnum), '^\s*</\<\('.s:html_indent_tags.'\)\>') - let open = <SID>HtmlIndentOpen(a:lnum, s:html_indent_tags) - let close = <SID>HtmlIndentClose(a:lnum, s:html_indent_tags) + let open = <SID>HtmlIndentOpen(a:lnum, s:html_indent_tags) - <SID>HtmlIndentOpen(a:lnum, s:html_noindent_tags) + let close = <SID>HtmlIndentClose(a:lnum, s:html_indent_tags) - <SID>HtmlIndentClose(a:lnum, s:html_noindent_tags) if 0 != open || 0 != close return open - close endif diff --git a/indent/liquid.vim b/indent/liquid.vim index 2025dacd..1f12eec5 100644 --- a/indent/liquid.vim +++ b/indent/liquid.vim @@ -56,10 +56,11 @@ function! GetLiquidIndent(...) let line = substitute(line,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','') let line .= matchstr(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+') let cline = substitute(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','') - let ind += &sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>') - let ind -= &sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>') - let ind -= &sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>') - let ind -= &sw * s:count(cline,'{%\s*end\w*$') + let sw = exists('*shiftwidth') ? shiftwidth() : &sw + let ind += sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>') + let ind -= sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>') + let ind -= sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>') + let ind -= sw * s:count(cline,'{%\s*end\w*$') return ind endfunction diff --git a/indent/jade.vim b/indent/pug.vim index da29e0cf..6518d7c3 100644 --- a/indent/jade.vim +++ b/indent/pug.vim @@ -1,9 +1,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jade') == -1 " Vim indent file -" Language: Jade +" Language: Pug " Maintainer: Joshua Borton -" Credits: Tim Pope (vim-jade) +" Credits: Tim Pope (vim-pug) " Last Change: 2010 Sep 22 if exists("b:did_indent") @@ -14,25 +14,25 @@ unlet! b:did_indent let b:did_indent = 1 setlocal autoindent -setlocal indentexpr=GetJadeIndent() +setlocal indentexpr=GetPugIndent() setlocal indentkeys=o,O,*<Return>,},],0),!^F " Only define the function once. -if exists("*GetJadeIndent") +if exists("*GetPugIndent") finish endif let s:attributes = '\%((.\{-\})\)' let s:tag = '\([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*' -if !exists('g:jade_self_closing_tags') - let g:jade_self_closing_tags = 'meta|link|img|hr|br|input' +if !exists('g:pug_self_closing_tags') + let g:pug_self_closing_tags = 'meta|link|img|hr|br|input' endif setlocal formatoptions+=r setlocal comments+=n:\| -function! GetJadeIndent() +function! GetPugIndent() let lnum = prevnonblank(v:lnum-1) if lnum == 0 return 0 @@ -60,9 +60,9 @@ function! GetJadeIndent() return increase elseif line == '-#' return increase - elseif line =~? '^\v%('.g:jade_self_closing_tags.')>' + elseif line =~? '^\v%('.g:pug_self_closing_tags.')>' return indent - elseif group =~? '\v^%(jadeAttributesDelimiter|jadeClass|jadeId|htmlTagName|htmlSpecialTagName|jadeFilter|jadeTagBlockChar)$' + elseif group =~? '\v^%(pugAttributesDelimiter|pugClass|pugId|htmlTagName|htmlSpecialTagName|pugFilter|pugTagBlockChar)$' return increase else return indent diff --git a/indent/ruby.vim b/indent/ruby.vim index 46615343..3feb824a 100644 --- a/indent/ruby.vim +++ b/indent/ruby.vim @@ -125,7 +125,7 @@ let s:indent_access_modifier_regex = '\C^\s*\%(protected\|private\)\s*\%(#.*\)\= " The reason is that the pipe matches a hanging "|" operator. " let s:block_regex = - \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|\s*(*\s*\%([*@&]\=\h\w*,\=\s*\)\%(,\s*(*\s*[*@&]\=\h\w*\s*)*\s*\)*|\)\=\s*\%(#.*\)\=$' + \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|[^|]*|\)\=\s*\%(#.*\)\=$' let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex diff --git a/indent/sass.vim b/indent/sass.vim index 04a2c750..f9ad30eb 100644 --- a/indent/sass.vim +++ b/indent/sass.vim @@ -31,9 +31,7 @@ function! GetSassIndent() let indent = indent(lnum) let cindent = indent(v:lnum) if line !~ s:property && line !~ s:extend && cline =~ s:property - return indent + &sw - "elseif line =~ s:property && cline !~ s:property - "return indent - &sw + return indent + (exists('*shiftwidth') ? shiftwidth() : &sw) else return -1 endif |