summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2014-01-09 11:59:09 +0100
committerAdam Stankiewicz <sheerun@sher.pl>2014-01-09 11:59:09 +0100
commitf211f02d1e53dbb4eada17e999eba81bccaf1fb2 (patch)
tree0c26fd0f916643af27e56fab71d3fe8dc58e4231 /indent
parente45b23b6ee6e3b00ba4c7111f0c703f93fea9123 (diff)
downloadvim-polyglot-f211f02d1e53dbb4eada17e999eba81bccaf1fb2.tar.gz
vim-polyglot-f211f02d1e53dbb4eada17e999eba81bccaf1fb2.zip
Update
Diffstat (limited to 'indent')
-rw-r--r--indent/clojure.vim9
-rw-r--r--indent/elixir.vim48
-rw-r--r--indent/ruby.vim36
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