diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2014-01-09 11:59:09 +0100 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2014-01-09 11:59:09 +0100 | 
| commit | f211f02d1e53dbb4eada17e999eba81bccaf1fb2 (patch) | |
| tree | 0c26fd0f916643af27e56fab71d3fe8dc58e4231 /indent | |
| parent | e45b23b6ee6e3b00ba4c7111f0c703f93fea9123 (diff) | |
| download | vim-polyglot-f211f02d1e53dbb4eada17e999eba81bccaf1fb2.tar.gz vim-polyglot-f211f02d1e53dbb4eada17e999eba81bccaf1fb2.zip | |
Update
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/clojure.vim | 9 | ||||
| -rw-r--r-- | indent/elixir.vim | 48 | ||||
| -rw-r--r-- | indent/ruby.vim | 36 | 
3 files changed, 60 insertions, 33 deletions
| diff --git a/indent/clojure.vim b/indent/clojure.vim index fd9ebb69..a92e273c 100644 --- a/indent/clojure.vim +++ b/indent/clojure.vim @@ -148,6 +148,10 @@ if exists("*searchpairpos")  		return val  	endfunction +	function! s:StripNamespaceAndMacroChars(word) +		return substitute(a:word, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '') +	endfunction +  	function! s:ClojureIsMethodSpecialCaseWorker(position)  		" Find the next enclosing form.  		call search('\S', 'Wb') @@ -167,7 +171,8 @@ if exists("*searchpairpos")  		call cursor(nextParen)  		call search('\S', 'W') -		if g:clojure_special_indent_words =~ '\<' . s:CurrentWord() . '\>' +		let w = s:StripNamespaceAndMacroChars(s:CurrentWord()) +		if g:clojure_special_indent_words =~ '\<' . w . '\>'  			return 1  		endif @@ -273,7 +278,7 @@ if exists("*searchpairpos")  		" metacharacters.  		"  		" e.g. clojure.core/defn and #'defn should both indent like defn. -		let ww = substitute(w, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '') +		let ww = s:StripNamespaceAndMacroChars(w)  		if &lispwords =~ '\V\<' . ww . '\>'  			return paren[1] + &shiftwidth - 1 diff --git a/indent/elixir.vim b/indent/elixir.vim index a71c466c..01303c21 100644 --- a/indent/elixir.vim +++ b/indent/elixir.vim @@ -25,10 +25,11 @@ let s:block_skip   = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . s:s  let s:block_start  = 'do\|fn'  let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue'  let s:block_end    = 'end' +let s:arrow        = '^.*->$'  let s:pipeline     = '^\s*|>.*$' -let s:indent_keywords   = '\<\%(' . s:block_start . '\|' . s:block_middle . '\)$' -let s:deindent_keywords = '^\s*\<\%(' . s:block_end . '\|' . s:block_middle . '\)\>' +let s:indent_keywords   = '\<\%(' . s:block_start . '\|' . s:block_middle . '\)$' . '\|' . s:arrow +let s:deindent_keywords = '^\s*\<\%(' . s:block_end . '\|' . s:block_middle . '\)\>' . '\|' . s:arrow  function! GetElixirIndent(...)    let lnum = prevnonblank(v:lnum - 1) @@ -40,42 +41,38 @@ function! GetElixirIndent(...)    endif    if synIDattr(synID(v:lnum, 1, 1), "name") !~ s:skip_syntax -    let splited_line = split(getline(lnum), '\zs') -    let opened_symbol  = 0 +    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 getline(lnum) =~ s:indent_keywords . -          \ '\|^\s*\%(.*->\)$' +    if last_line =~ s:indent_keywords        let ind += &sw      endif      " if line starts with pipeline -    " and last line doesn't start with pipeline -    if getline(v:lnum) =~ s:pipeline && -          \ getline(lnum) !~ s:pipeline -      let ind += &sw -    endif - -    " if last line starts with pipeline -    " and currentline doesn't start with pipeline -    if getline(lnum) =~ s:pipeline && -          \ getline(v:lnum) !~ s:pipeline -      let ind -= &sw +    " and last line is an attribution +    " indents pipeline in same level as attribution +    if current_line =~ s:pipeline && +          \ last_line =~ '^[^=]\+=.\+$' +      let b:old_ind = ind +      let ind += round(match(last_line, '=') / &sw) * &sw      endif      " if last line starts with pipeline      " and current line doesn't start with pipeline -    " but last line started a block -    if getline(lnum) =~ s:pipeline && -          \ getline(v:lnum) !~ s:pipeline && -          \ getline(lnum) =~ s:block_start -      let ind += &sw +    " returns the indentation before the pipeline +    if last_line =~ s:pipeline && +          \ current_line !~ s:pipeline +      let ind = b:old_ind      endif -    if getline(v:lnum) =~ s:deindent_keywords +    if current_line =~ s:deindent_keywords        let bslnum = searchpair( '\<\%(' . s:block_start . '\):\@!\>',              \ '\<\%(' . s:block_middle . '\):\@!\>\zs',              \ '\<:\@<!' . s:block_end . '\>\zs', @@ -83,6 +80,11 @@ function! GetElixirIndent(...)              \ s:block_skip )        let ind = indent(bslnum)      endif + +    " indent case statements '->' +    if current_line =~ s:arrow +      let ind += &sw +    endif    endif    return ind diff --git a/indent/ruby.vim b/indent/ruby.vim index 89a430c4..2a571bd2 100644 --- a/indent/ruby.vim +++ b/indent/ruby.vim @@ -22,7 +22,7 @@ setlocal nosmartindent  " Now, set up our indentation expression and keys that trigger it.  setlocal indentexpr=GetRubyIndent(v:lnum) -setlocal indentkeys=0{,0},0),0],!^F,o,O,e,: +setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,.  setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end  setlocal indentkeys+==private,=protected,=public @@ -55,9 +55,10 @@ let s:skip_expr =        \ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"  " Regex used for words that, at the start of a line, add a level of indent. -let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' . -      \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' . -      \ '\|rescue\):\@!\>' . +let s:ruby_indent_keywords = +      \ '^\s*\zs\<\%(module\|class\|if\|for' . +      \   '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' . +      \   '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .        \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .        \    '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>' @@ -70,7 +71,8 @@ let s:ruby_deindent_keywords =  " TODO: the do here should be restricted somewhat (only at end of line)?  let s:end_start_regex =        \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . -      \ '\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\):\@!\>' . +      \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' . +      \   '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .        \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'  " Regex that defines the middle-match for the 'end' keyword. @@ -99,10 +101,10 @@ let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'  let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'  " Regex that describes all indent access modifiers -let s:access_modifier_regex = '\C^\s*\%(private\|public\|protected\)\s*\%(#.*\)\=$' +let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\=$'  " Regex that describes the indent access modifiers (excludes public) -let s:indent_access_modifier_regex = '\C^\s*\%(private\|protected\)\s*\%(#.*\)\=$' +let s:indent_access_modifier_regex = '\C^\s*\%(protected\|private\)\s*\%(#.*\)\=$'  " Regex that defines blocks.  " @@ -118,6 +120,9 @@ let s:block_regex =  let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex +" Regex that describes a leading operator (only a method call's dot for now) +let s:leading_operator_regex = '^\s*[.]' +  " 2. Auxiliary Functions {{{1  " ====================== @@ -177,7 +182,11 @@ function s:GetMSL(lnum)      " Otherwise, terminate search as we have found our MSL already.      let line = getline(lnum) -    if s:Match(lnum, s:splat_regex) +    if s:Match(msl, s:leading_operator_regex) +      " If the current line starts with a leading operator, keep its indent +      " and keep looking for an MSL. +      let msl = lnum +    elseif s:Match(lnum, s:splat_regex)        " If the above line looks like the "*" of a splat, use the current one's        " indentation.        " @@ -440,6 +449,11 @@ function GetRubyIndent(...)      return 0    endif +  " If the current line starts with a leading operator, add a level of indent. +  if s:Match(clnum, s:leading_operator_regex) +    return indent(s:GetMSL(clnum)) + &sw +  endif +    " 3.3. Work on the previous line. {{{2    " ------------------------------- @@ -479,6 +493,12 @@ function GetRubyIndent(...)      return indent(s:GetMSL(lnum)) + &sw    endif +  " If the previous line started with a leading operator, use its MSL's level +  " of indent +  if s:Match(lnum, s:leading_operator_regex) +    return indent(s:GetMSL(lnum)) +  endif +    " If the previous line ended with the "*" of a splat, add a level of indent    if line =~ s:splat_regex      return indent(lnum) + &sw | 
