diff options
Diffstat (limited to 'indent')
-rw-r--r-- | indent/crystal.vim | 6 | ||||
-rw-r--r-- | indent/cython.vim | 64 | ||||
-rw-r--r-- | indent/dart.vim | 2 | ||||
-rw-r--r-- | indent/go.vim | 23 | ||||
-rw-r--r-- | indent/julia.vim | 5 | ||||
-rw-r--r-- | indent/markdown.vim | 16 | ||||
-rw-r--r-- | indent/nix.vim | 16 | ||||
-rw-r--r-- | indent/python.vim | 64 | ||||
-rw-r--r-- | indent/ruby.vim | 42 | ||||
-rw-r--r-- | indent/rust.vim | 36 |
10 files changed, 139 insertions, 135 deletions
diff --git a/indent/crystal.vim b/indent/crystal.vim index fad2822c..9fd6c1f8 100644 --- a/indent/crystal.vim +++ b/indent/crystal.vim @@ -129,17 +129,17 @@ let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\ " Check if the character at lnum:col is inside a string, comment, or is ascii. function s:IsInStringOrComment(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_strcom endfunction " Check if the character at lnum:col is inside a string. function s:IsInString(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_string endfunction " Check if the character at lnum:col is inside a string or documentation. function s:IsInStringOrDocumentation(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_stringdoc + return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_stringdoc endfunction " Check if the character at lnum:col is inside a string delimiter diff --git a/indent/cython.vim b/indent/cython.vim index c6777c00..b44839d8 100644 --- a/indent/cython.vim +++ b/indent/cython.vim @@ -36,6 +36,10 @@ if !exists('g:python_pep8_indent_multiline_string') let g:python_pep8_indent_multiline_string = 0 endif +if !exists('g:python_pep8_indent_hang_closing') + let g:python_pep8_indent_hang_closing = 0 +endif + let s:block_rules = { \ '^\s*elif\>': ['if', 'elif'], \ '^\s*except\>': ['try', 'except'], @@ -59,7 +63,7 @@ let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>' " jedi* refers to syntax definitions from jedi-vim for call signatures, which " are inserted temporarily into the buffer. let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' . - \ '=~? "\\vstring|comment|jedi\\S"' + \ '=~? "\\vstring|comment|^pythonbytes%(contents)=$|jedi\\S"' let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' . \ '=~? "\\vcomment|jedi\\S"' @@ -90,14 +94,6 @@ else endfunction endif -function! s:pair_sort(x, y) - if a:x[0] == a:y[0] - return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1 - else - return a:x[0] > a:y[0] ? 1 : -1 - endif -endfunction - " Find backwards the closest open parenthesis/bracket/brace. function! s:find_opening_paren(...) " optional arguments: line and column (defaults to 1) to search around @@ -144,27 +140,21 @@ endfunction " Find possible indent(s) of the block starter that matches the current line. function! s:find_start_of_block(lnum, types, multiple) let r = [] - let types = copy(a:types) let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>' let lnum = a:lnum let last_indent = indent(lnum) + 1 while lnum > 0 && last_indent > 0 let indent = indent(lnum) if indent < last_indent - for type in types - let re = '\v^\s*'.type.'>' - if getline(lnum) =~# re - if !a:multiple - return [indent] - endif - if index(r, indent) == -1 - let r += [indent] - endif - " Remove any handled type, e.g. 'if'. - call remove(types, index(types, type)) + if getline(lnum) =~# re + if !a:multiple + return [indent] + endif + if index(r, indent) == -1 + let r += [indent] endif - endfor - let last_indent = indent(lnum) + let last_indent = indent + endif endif let lnum = prevnonblank(lnum - 1) endwhile @@ -205,8 +195,11 @@ function! s:indent_like_opening_paren(lnum) \ s:skip_after_opening_paren, paren_lnum, paren_col+1) let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]' + let hang_closing = get(b:, 'python_pep8_indent_hang_closing', + \ get(g:, 'python_pep8_indent_hang_closing', 0)) + if nothing_after_opening_paren - if starts_with_closing_paren + if starts_with_closing_paren && !hang_closing let res = base else let res = base + s:sw() @@ -220,10 +213,13 @@ function! s:indent_like_opening_paren(lnum) " indent further to distinguish the continuation line " from the next logical line. if text =~# b:control_statement && res == base + s:sw() - return base + s:sw() * 2 - else - return res + " But only if not inside parens itself (Flake's E127). + let [paren_lnum, _] = s:find_opening_paren(paren_lnum) + if paren_lnum <= 0 + return res + s:sw() + endif endif + return res endfunction " Match indent of first block of this type. @@ -337,11 +333,11 @@ endfunction " Is the syntax at lnum (and optionally cnum) a python string? function! s:is_python_string(lnum, ...) let line = getline(a:lnum) - let linelen = len(line) - if linelen < 1 - let linelen = 1 + if a:0 + let cols = type(a:1) != type([]) ? [a:1] : a:1 + else + let cols = range(1, max([1, len(line)])) endif - let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen) for cnum in cols if match(map(synstack(a:lnum, cnum), \ "synIDattr(v:val, 'name')"), 'python\S*String') == -1 @@ -361,7 +357,7 @@ function! GetPythonPEPIndent(lnum) let prevline = getline(a:lnum-1) " Multilinestrings: continous, docstring or starting. - if s:is_python_string(a:lnum-1, len(prevline)) + if s:is_python_string(a:lnum-1, max([1, len(prevline)])) \ && (s:is_python_string(a:lnum, 1) \ || match(line, '^\%("""\|''''''\)') != -1) @@ -379,8 +375,8 @@ function! GetPythonPEPIndent(lnum) endif if s:is_python_string(a:lnum-1) - " Previous line is (completely) a string. - return indent(a:lnum-1) + " Previous line is (completely) a string: keep current indent. + return -1 endif if match(prevline, '^\s*\%("""\|''''''\)') != -1 diff --git a/indent/dart.vim b/indent/dart.vim index 601abbb0..8d685df9 100644 --- a/indent/dart.vim +++ b/indent/dart.vim @@ -6,7 +6,7 @@ endif let b:did_indent = 1 setlocal cindent -setlocal cinoptions+=j1,J1 +setlocal cinoptions+=j1,J1,(2s,u2s,U1,m1,+2s setlocal indentexpr=DartIndent() diff --git a/indent/go.vim b/indent/go.vim index fd973e45..887fb587 100644 --- a/indent/go.vim +++ b/indent/go.vim @@ -26,17 +26,6 @@ if exists("*GoIndent") finish endif -" use shiftwidth function only if it's available -if exists('*shiftwidth') - func s:sw() - return shiftwidth() - endfunc -else - func s:sw() - return &sw - endfunc -endif - function! GoIndent(lnum) let prevlnum = prevnonblank(a:lnum-1) if prevlnum == 0 @@ -51,19 +40,23 @@ function! GoIndent(lnum) let ind = previ + if prevl =~ ' = `[^`]*$' + " previous line started a multi-line raw string + return 0 + endif if prevl =~ '[({]\s*$' " previous line opened a block - let ind += s:sw() + let ind += shiftwidth() endif if prevl =~# '^\s*\(case .*\|default\):$' " previous line is part of a switch statement - let ind += s:sw() + let ind += shiftwidth() endif " TODO: handle if the previous line is a label. if thisl =~ '^\s*[)}]' " this line closed a block - let ind -= s:sw() + let ind -= shiftwidth() endif " Colons are tricky. @@ -71,7 +64,7 @@ function! GoIndent(lnum) " We ignore trying to deal with jump labels because (a) they're rare, and " (b) they're hard to disambiguate from a composite literal key. if thisl =~# '^\s*\(case .*\|default\):$' - let ind -= s:sw() + let ind -= shiftwidth() endif return ind diff --git a/indent/julia.vim b/indent/julia.vim index 6382ec2e..fd5557cd 100644 --- a/indent/julia.vim +++ b/indent/julia.vim @@ -50,8 +50,9 @@ function GetJuliaNestingStruct(lnum, ...) let e = a:0 > 1 ? a:2 : -1 let blocks_stack = [] let num_closed_blocks = 0 + let tt = get(b:, 'julia_syntax_version', 10) == 6 ? '\|\%(\%(abstract\|primitive\)\s\+\)\@<!type' : '' while 1 - let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\=\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|\%(\%(abstract\|primitive\)\s\+\)\@<!type\|immutable\|let\|\%(bare\)\?module\|quote\|do\)\>', s, e) + let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\?\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|\%(bare\)\?module\|quote\|do'.tt.'\)\>', s, e) let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s, e) if fb < 0 && fe < 0 @@ -133,7 +134,7 @@ function GetJuliaNestingStruct(lnum, ...) continue endif - let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(\%(abstract\|primitive\)\s\+\)\?type\|immutable\|let\|quote\|do\)\>', s) + let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|quote\|do'.tt.'\)\>', s) if i >= 0 && i == fb if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1 let s = i+11 diff --git a/indent/markdown.vim b/indent/markdown.vim index fa2b460d..7ae42024 100644 --- a/indent/markdown.vim +++ b/indent/markdown.vim @@ -7,15 +7,15 @@ setlocal indentexpr=GetMarkdownIndent() setlocal nolisp setlocal autoindent -" Automatically insert bullets -setlocal formatoptions+=r -" Do not automatically insert bullets when auto-wrapping with text-width -setlocal formatoptions-=c -" Accept various markers as bullets -setlocal comments=b:*,b:+,b:- - " Automatically continue blockquote on line break -setlocal comments+=b:> +setlocal formatoptions+=r +setlocal comments=b:> +if get(g:, "vim_markdown_auto_insert_bullets", 1) + " Do not automatically insert bullets when auto-wrapping with text-width + setlocal formatoptions-=c + " Accept various markers as bullets + setlocal comments+=b:*,b:+,b:- +endif " Only define the function once if exists("*GetMarkdownIndent") | finish | endif diff --git a/indent/nix.vim b/indent/nix.vim index 2910cbd6..b31ae42e 100644 --- a/indent/nix.vim +++ b/indent/nix.vim @@ -11,7 +11,7 @@ endif let b:did_indent = 1 setlocal indentexpr=GetNixIndent() -setlocal indentkeys+=0=then,0=else,0=inherit,*<Return> +setlocal indentkeys+=0=then,0=else,0=inherit,0=in,*<Return> if exists("*GetNixIndent") finish @@ -21,8 +21,8 @@ let s:cpo_save = &cpo set cpo&vim let s:skip_syntax = '\%(Comment\|String\)$' -let s:binding_open = '\%(\<let\>\|{\)' -let s:binding_close = '\%(\<in\>\|}\)' +let s:binding_open = '\%(\<let\>\)' +let s:binding_close = '\%(\<in\>\)' let s:block_open = '\%({\|[\)' let s:block_close = '\%(}\|]\)' @@ -54,14 +54,6 @@ function! GetNixIndent() return indent(bslnum) endif - if last_line =~ ';$' - let bslnum = searchpair(s:binding_open, '', s:binding_close, 'bnW', - \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "StringSpecial$"') - if bslnum != 0 - let ind = indent(bslnum) + &sw - endif - endif - if last_line =~ s:block_open . '\s*$' let ind += &sw endif @@ -78,7 +70,7 @@ function! GetNixIndent() let ind += &sw endif - if getline(v:lnum - 1) =~ '^\<in\s*$' + if last_line =~ '^\<in\s*$' let ind += &sw endif diff --git a/indent/python.vim b/indent/python.vim index c6777c00..b44839d8 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -36,6 +36,10 @@ if !exists('g:python_pep8_indent_multiline_string') let g:python_pep8_indent_multiline_string = 0 endif +if !exists('g:python_pep8_indent_hang_closing') + let g:python_pep8_indent_hang_closing = 0 +endif + let s:block_rules = { \ '^\s*elif\>': ['if', 'elif'], \ '^\s*except\>': ['try', 'except'], @@ -59,7 +63,7 @@ let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>' " jedi* refers to syntax definitions from jedi-vim for call signatures, which " are inserted temporarily into the buffer. let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' . - \ '=~? "\\vstring|comment|jedi\\S"' + \ '=~? "\\vstring|comment|^pythonbytes%(contents)=$|jedi\\S"' let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' . \ '=~? "\\vcomment|jedi\\S"' @@ -90,14 +94,6 @@ else endfunction endif -function! s:pair_sort(x, y) - if a:x[0] == a:y[0] - return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1 - else - return a:x[0] > a:y[0] ? 1 : -1 - endif -endfunction - " Find backwards the closest open parenthesis/bracket/brace. function! s:find_opening_paren(...) " optional arguments: line and column (defaults to 1) to search around @@ -144,27 +140,21 @@ endfunction " Find possible indent(s) of the block starter that matches the current line. function! s:find_start_of_block(lnum, types, multiple) let r = [] - let types = copy(a:types) let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>' let lnum = a:lnum let last_indent = indent(lnum) + 1 while lnum > 0 && last_indent > 0 let indent = indent(lnum) if indent < last_indent - for type in types - let re = '\v^\s*'.type.'>' - if getline(lnum) =~# re - if !a:multiple - return [indent] - endif - if index(r, indent) == -1 - let r += [indent] - endif - " Remove any handled type, e.g. 'if'. - call remove(types, index(types, type)) + if getline(lnum) =~# re + if !a:multiple + return [indent] + endif + if index(r, indent) == -1 + let r += [indent] endif - endfor - let last_indent = indent(lnum) + let last_indent = indent + endif endif let lnum = prevnonblank(lnum - 1) endwhile @@ -205,8 +195,11 @@ function! s:indent_like_opening_paren(lnum) \ s:skip_after_opening_paren, paren_lnum, paren_col+1) let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]' + let hang_closing = get(b:, 'python_pep8_indent_hang_closing', + \ get(g:, 'python_pep8_indent_hang_closing', 0)) + if nothing_after_opening_paren - if starts_with_closing_paren + if starts_with_closing_paren && !hang_closing let res = base else let res = base + s:sw() @@ -220,10 +213,13 @@ function! s:indent_like_opening_paren(lnum) " indent further to distinguish the continuation line " from the next logical line. if text =~# b:control_statement && res == base + s:sw() - return base + s:sw() * 2 - else - return res + " But only if not inside parens itself (Flake's E127). + let [paren_lnum, _] = s:find_opening_paren(paren_lnum) + if paren_lnum <= 0 + return res + s:sw() + endif endif + return res endfunction " Match indent of first block of this type. @@ -337,11 +333,11 @@ endfunction " Is the syntax at lnum (and optionally cnum) a python string? function! s:is_python_string(lnum, ...) let line = getline(a:lnum) - let linelen = len(line) - if linelen < 1 - let linelen = 1 + if a:0 + let cols = type(a:1) != type([]) ? [a:1] : a:1 + else + let cols = range(1, max([1, len(line)])) endif - let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen) for cnum in cols if match(map(synstack(a:lnum, cnum), \ "synIDattr(v:val, 'name')"), 'python\S*String') == -1 @@ -361,7 +357,7 @@ function! GetPythonPEPIndent(lnum) let prevline = getline(a:lnum-1) " Multilinestrings: continous, docstring or starting. - if s:is_python_string(a:lnum-1, len(prevline)) + if s:is_python_string(a:lnum-1, max([1, len(prevline)])) \ && (s:is_python_string(a:lnum, 1) \ || match(line, '^\%("""\|''''''\)') != -1) @@ -379,8 +375,8 @@ function! GetPythonPEPIndent(lnum) endif if s:is_python_string(a:lnum-1) - " Previous line is (completely) a string. - return indent(a:lnum-1) + " Previous line is (completely) a string: keep current indent. + return -1 endif if match(prevline, '^\s*\%("""\|''''''\)') != -1 diff --git a/indent/ruby.vim b/indent/ruby.vim index 3617a925..78d10d7a 100644 --- a/indent/ruby.vim +++ b/indent/ruby.vim @@ -69,7 +69,7 @@ let s:skip_expr = 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\):\@!\>' . + \ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' . \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' . \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>' @@ -83,7 +83,7 @@ let s:ruby_deindent_keywords = let s:end_start_regex = \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' . - \ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' . + \ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' . \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>' " Regex that defines the middle-match for the 'end' keyword. @@ -195,8 +195,29 @@ function! GetRubyIndent(...) abort " 2.3. Work on the previous line. {{{2 " ------------------------------- + + " Special case: we don't need the real s:PrevNonBlankNonString for an empty + " line inside a string. And that call can be quite expensive in that + " particular situation. let indent_callback_names = [ \ 's:EmptyInsideString', + \ ] + + for callback_name in indent_callback_names +" Decho "Running: ".callback_name + let indent = call(function(callback_name), [indent_info]) + + if indent >= 0 +" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info) + return indent + endif + endfor + + " Previous line number + let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1) + let indent_info.pline = getline(indent_info.plnum) + + let indent_callback_names = [ \ 's:StartOfFile', \ 's:AfterAccessModifier', \ 's:ContinuedLine', @@ -208,10 +229,6 @@ function! GetRubyIndent(...) abort \ 's:AfterIndentKeyword', \ ] - " Previous line number - let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1) - let indent_info.pline = getline(indent_info.plnum) - for callback_name in indent_callback_names " Decho "Running: ".callback_name let indent = call(function(callback_name), [indent_info]) @@ -389,12 +406,17 @@ function! s:LeadingOperator(cline_info) abort endfunction function! s:EmptyInsideString(pline_info) abort - " If the line is empty and inside a string (plnum would not be the real - " prevnonblank in that case), use the previous line's indent + " If the line is empty and inside a string (the previous line is a string, + " too), use the previous line's indent let info = a:pline_info - if info.cline =~ '^\s*$' && info.plnum != prevnonblank(info.clnum - 1) - return indent(prevnonblank(info.clnum)) + let plnum = prevnonblank(info.clnum - 1) + let pline = getline(plnum) + + if info.cline =~ '^\s*$' + \ && s:IsInStringOrComment(plnum, 1) + \ && s:IsInStringOrComment(plnum, strlen(pline)) + return indent(plnum) endif return -1 endfunction diff --git a/indent/rust.vim b/indent/rust.vim index fa4dfb54..abf8087f 100644 --- a/indent/rust.vim +++ b/indent/rust.vim @@ -31,8 +31,10 @@ if exists("*GetRustIndent") finish endif +" vint: -ProhibitAbbreviationOption let s:save_cpo = &cpo set cpo&vim +" vint: +ProhibitAbbreviationOption " Come here when loading the script the first time. @@ -46,12 +48,12 @@ function! s:get_line_trimmed(lnum) " If the last character in the line is a comment, do a binary search for " the start of the comment. synID() is slow, a linear search would take " too long on a long line. - if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo' + if synIDattr(synID(a:lnum, line_len, 1), "name") =~? 'Comment\|Todo' let min = 1 let max = line_len while min < max let col = (min + max) / 2 - if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo' + if synIDattr(synID(a:lnum, col, 1), "name") =~? 'Comment\|Todo' let max = col else let min = col + 1 @@ -71,7 +73,7 @@ function! s:is_string_comment(lnum, col) if has('syntax_items') for id in synstack(a:lnum, a:col) let synname = synIDattr(id, "name") - if synname == "rustString" || synname =~ "^rustComment" + if synname ==# "rustString" || synname =~# "^rustComment" return 1 endif endfor @@ -90,13 +92,13 @@ function GetRustIndent(lnum) if has('syntax_items') let synname = synIDattr(synID(a:lnum, 1, 1), "name") - if synname == "rustString" + if synname ==# "rustString" " If the start of the line is in a string, don't change the indent return -1 - elseif synname =~ '\(Comment\|Todo\)' - \ && line !~ '^\s*/\*' " not /* opening line - if synname =~ "CommentML" " multi-line - if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*' + elseif synname =~? '\(Comment\|Todo\)' + \ && line !~# '^\s*/\*' " not /* opening line + if synname =~? "CommentML" " multi-line + if line !~# '^\s*\*' && getline(a:lnum - 1) =~# '^\s*/\*' " This is (hopefully) the line after a /*, and it has no " leader, so the correct indentation is that of the " previous line. @@ -123,22 +125,22 @@ function GetRustIndent(lnum) " Search backwards for the previous non-empty line. let prevlinenum = prevnonblank(a:lnum - 1) let prevline = s:get_line_trimmed(prevlinenum) - while prevlinenum > 1 && prevline !~ '[^[:blank:]]' + while prevlinenum > 1 && prevline !~# '[^[:blank:]]' let prevlinenum = prevnonblank(prevlinenum - 1) let prevline = s:get_line_trimmed(prevlinenum) endwhile " Handle where clauses nicely: subsequent values should line up nicely. - if prevline[len(prevline) - 1] == "," + if prevline[len(prevline) - 1] ==# "," \ && prevline =~# '^\s*where\s' return indent(prevlinenum) + 6 endif - if prevline[len(prevline) - 1] == "," - \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]' - \ && prevline !~ '^\s*fn\s' - \ && prevline !~ '([^()]\+,$' - \ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>' + if prevline[len(prevline) - 1] ==# "," + \ && s:get_line_trimmed(a:lnum) !~# '^\s*[\[\]{}]' + \ && prevline !~# '^\s*fn\s' + \ && prevline !~# '([^()]\+,$' + \ && s:get_line_trimmed(a:lnum) !~# '^\s*\S\+\s*=>' " Oh ho! The previous line ended in a comma! I bet cindent will try to " take this too far... For now, let's normally use the previous line's " indent. @@ -197,7 +199,7 @@ function GetRustIndent(lnum) else " At the module scope, inside square brackets only "if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum - if line =~ "^\\s*]" + if line =~# "^\\s*]" " It's the closing line, dedent it return 0 else @@ -211,8 +213,10 @@ function GetRustIndent(lnum) return cindent(a:lnum) endfunction +" vint: -ProhibitAbbreviationOption let &cpo = s:save_cpo unlet s:save_cpo +" vint: +ProhibitAbbreviationOption " vim: set et sw=4 sts=4 ts=8: |