diff options
| author | Kevin Ballard <kevin@sb.org> | 2014-05-08 19:04:23 -0700 |
|---|---|---|
| committer | Kevin Ballard <kevin@sb.org> | 2014-05-08 19:04:23 -0700 |
| commit | 0381ad4fdf27c36a033dacd924fbf7c359298c87 (patch) | |
| tree | 205a210780924d869f3078e85db6a3d20cff38b1 | |
| parent | c4f0980d2ea43d3ab7e0cf14fee81de8df5c867a (diff) | |
| download | rust-0381ad4fdf27c36a033dacd924fbf7c359298c87.tar.gz rust-0381ad4fdf27c36a033dacd924fbf7c359298c87.zip | |
vim: Fix an indentation issue with cindent
cindent handles the following case incorrectly:
impl X {
b: int,
//
c: int,
}
if you try and insert a new line after the `c` declaration.
To fix this, fix the get_line_trimmed() function to work properly, and
then extend GetRustIndent to keep searching backwards until it finds a
non-blank line after trimming. This lets it handle the trailing comma
case properly, as if the comment were never there.
Fixes #14041.
| -rw-r--r-- | src/etc/vim/indent/rust.vim | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/etc/vim/indent/rust.vim b/src/etc/vim/indent/rust.vim index 9fdc18582ba..b9d6330c8bb 100644 --- a/src/etc/vim/indent/rust.vim +++ b/src/etc/vim/indent/rust.vim @@ -13,7 +13,7 @@ setlocal cindent setlocal cinoptions=L0,(0,Ws,JN,j1 setlocal cinkeys=0{,0},!^F,o,O,0[,0] " Don't think cinwords will actually do anything at all... never mind -setlocal cinwords=do,for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern +setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern " Some preliminary settings setlocal nolisp " Make sure lisp indenting doesn't supersede us @@ -40,12 +40,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 @@ -87,10 +87,10 @@ function GetRustIndent(lnum) 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 + elseif synname =~ '\(Comment\|Todo\)' + \ && line !~ '^\s*/\*' " not /* opening line if synname =~ "CommentML" " multi-line - if line !~ "^\\s*\\*" && getline(a:lnum - 1) =~ "^\\s*/\\*" + 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. @@ -115,11 +115,16 @@ function GetRustIndent(lnum) " }; " Search backwards for the previous non-empty line. - let prevline = s:get_line_trimmed(prevnonblank(a:lnum - 1)) + let prevlinenum = prevnonblank(a:lnum - 1) + let prevline = s:get_line_trimmed(prevlinenum) + while prevlinenum > 1 && prevline !~ '[^[:blank:]]' + let prevlinenum = prevnonblank(prevlinenum - 1) + let prevline = s:get_line_trimmed(prevlinenum) + endwhile if prevline[len(prevline) - 1] == "," - \ && s:get_line_trimmed(a:lnum) !~ "^\\s*[\\[\\]{}]" - \ && prevline !~ "^\\s*fn\\s" - \ && prevline !~ "([^()]\\+,$" + \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]' + \ && prevline !~ '^\s*fn\s' + \ && prevline !~ '([^()]\+,$' " 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. @@ -166,7 +171,7 @@ function GetRustIndent(lnum) " column zero) call cursor(a:lnum, 1) - if searchpair('{\|(', '', '}\|)', 'nbW' + if searchpair('{\|(', '', '}\|)', 'nbW', \ 's:is_string_comment(line("."), col("."))') == 0 if searchpair('\[', '', '\]', 'nbW', \ 's:is_string_comment(line("."), col("."))') == 0 |
