about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2014-05-08 19:04:23 -0700
committerKevin Ballard <kevin@sb.org>2014-05-08 19:04:23 -0700
commit0381ad4fdf27c36a033dacd924fbf7c359298c87 (patch)
tree205a210780924d869f3078e85db6a3d20cff38b1
parentc4f0980d2ea43d3ab7e0cf14fee81de8df5c867a (diff)
downloadrust-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.vim27
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