VIM和Scala——缩进问题?
我下载了Scala2.8,安装了包含的vim脚本,并尝试键入一些Scala代码。当我输入VIM和Scala——缩进问题?,vim,scala,Vim,Scala,我下载了Scala2.8,安装了包含的vim脚本,并尝试键入一些Scala代码。当我输入valx=1+2并按ENTER键时,缩进会转到v下方。当我输入valx=(1+2)时,缩进在x下面 如果VIM被任何人用于Scala,那么这个bug早就应该出现了。或者我是唯一一个看到这一点的人吗?使用当前2.8.0版本的缩进/scala.vim。最终版本我也有同样的结果。。。但我知道,它在早期版本中是有效的,因为我这里有一个文件。这是: " Vim indent file " Language : Sc
valx=1+2
并按ENTER键时,缩进会转到v下方。当我输入valx=(1+2)
时,缩进在x下面
如果VIM被任何人用于Scala,那么这个bug早就应该出现了。或者我是唯一一个看到这一点的人吗?使用当前2.8.0版本的
缩进/scala.vim
。最终版本我也有同样的结果。。。但我知道,它在早期版本中是有效的,因为我这里有一个文件。这是:
" Vim indent file
" Language : Scala (http://scala-lang.org/)
" Maintainer : Stefan Matthias Aust
" Last Change: 2006 Apr 13
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetScalaIndent()
setlocal indentkeys=0{,0},0),!^F,<>>,<CR>
setlocal autoindent sw=2 et
if exists("*GetScalaIndent")
finish
endif
function! CountParens(line)
let line = substitute(a:line, '"\(.\|\\"\)*"', '', 'g')
let open = substitute(line, '[^(]', '', 'g')
let close = substitute(line, '[^)]', '', 'g')
return strlen(open) - strlen(close)
endfunction
function! GetScalaIndent()
" Find a non-blank line above the current line.
let lnum = prevnonblank(v:lnum - 1)
" Hit the start of the file, use zero indent.
if lnum == 0
return 0
endif
let ind = indent(lnum)
let prevline = getline(lnum)
"Indent html literals
if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$'
return ind + &shiftwidth
endif
"### Taken from mail on scala mailing list
"### -------------------------------------
" Add a 'shiftwidth' after lines that start a block
" If if, for or while end with ), this is a one-line block
" If val, var, def end with =, this is a one-line block
"if prevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\|va[lr]\|def\)\>.*[)=]\s*$'
"\ || prevline =~ '^\s*\<else\>\s*$'
"\ || prevline =~ '{\s*$'
"let ind = ind + &shiftwidth
"endif
" Add a 'shiftwidth' after lines that start a block
" If if, for or while end with ), this is a one-line block
" If val, var, def end with =, this is a one-line block
if prevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\)\>.*[)]\s*$'
\ || prevline =~ '^\s*\<\(\(va[lr]\|def\)\>.*[=]\s*$'
\ || prevline =~ '^\s*\<else\>\s*$'
\ || prevline =~ '{\s*$'
let ind = ind + &shiftwidth
endif
" If parenthesis are unbalanced, indent or dedent
let c = CountParens(prevline)
echo c
if c > 0
let ind = ind + &shiftwidth
elseif c < 0
let ind = ind - &shiftwidth
endif
"### Taken from mail on scala mailing list
"### -------------------------------------
" Dedent after if, for, while and val, var, def without block
"let pprevline = getline(prevnonblank(lnum - 1))
"if pprevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\|va[lr]\|def\)\>.*[)=]\s*$'
"\ || pprevline =~ '^\s*\<else\>\s*$'
"let ind = ind - &shiftwidth
"endif
" Dedent after if, for, while and val, var, def without block
"let pprevline = getline(prevnonblank(lnum - 1))
if pprevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\)\>.*[)]\s*$'
\ || pprevline =~ '^\s*\<\(\va[lr]\|def\)\>.*[=]\s*$'
\ || pprevline =~ '^\s*\<else\>\s*$'
let ind = ind - &shiftwidth
endif
" Align 'for' clauses nicely
if prevline =~ '^\s*\<for\> (.*;\s*$'
let ind = ind - &shiftwidth + 5
endif
" Subtract a 'shiftwidth' on '}' or html
let thisline = getline(v:lnum)
if thisline =~ '^\s*[})]'
\ || thisline =~ '^\s*</[a-zA-Z][^>]*>'
let ind = ind - &shiftwidth
endif
return ind
endfunction
Vim缩进文件
语言:Scala(http://scala-lang.org/)
维护者:Stefan Matthias Aust
最后更改:2006年4月13日
如果存在(“b:是否缩进”)
完成
恩迪夫
设b:did_indent=1
setLocalIndentExpr=GetScalaIndent()
setlocal indentkeys=0{,0},0)^F、 >,
设置本地自动缩进sw=2 et
如果存在(“*GetScalaIndent”)
完成
恩迪夫
功能!CountParens(行)
让line=替换(a:line,“\(.\\\\”\)*“,”,“,”,g'))
让open=替换(行“[^(]”,“'g')
let close=替换(第“[^]”行、“g”)
返回strlen(打开)-strlen(关闭)
端功能
函数!GetScalaIndent()
“在当前行上方找到一个非空行。
设lnum=prevnonblank(v:lnum-1)
点击文件的开头,使用零缩进。
如果lnum==0
返回0
恩迪夫
设ind=缩进(lnum)
让prevline=getline(lnum)
“缩进html文本
如果上一行!~'/>\s*$和&prevline=~'^\s*]*>\s*$'
返回ind+&移位两位数
恩迪夫
“####摘自scala邮件列表上的邮件
"### -------------------------------------
“在开始块的行之后添加'shiftwidth'
“If、for或while end with”),这是一个单行块
“如果val、var、def结尾为=,则这是一个单行块
“如果prevline=~'^\s*\.[)=]\s*$”
“\\|| prevline=~'^\s*\\s*$”
“\\|| prevline=~'{\s*$”
“设ind=ind+&移位两次
“endif
“在开始块的行之后添加'shiftwidth'
“If、for或while end with”),这是一个单行块
“如果val、var、def结尾为=,则这是一个单行块
如果prevline=~'^\s*\.[]\s*$'
\| | prevline=~'^\s*\.[=]\s*$'
\| | prevline=~'^\s*\\s*$'
\| | prevline=~'{\s*$'
设ind=ind+&移位两次
恩迪夫
如果括号不平衡,请缩进或缩进
设c=CountParens(prevline)
回声c
如果c>0
设ind=ind+&移位两次
elseifc<0
设ind=ind-&移位两次
恩迪夫
“####摘自scala邮件列表上的邮件
"### -------------------------------------
“if、for、while和val、var、def之后的Dedent不带块
“设pprevline=getline(prevnonblank(lnum-1))
“如果pprevline=~'^\s*\.[)=]\s*$”
“\\|| pprevline=~'^\s*\\s*$”
“设ind=ind-&移位两次
“endif
“if、for、while和val、var、def之后的Dedent不带块
“设pprevline=getline(prevnonblank(lnum-1))
如果pprevline=~'^\s*\.*[)]\s*$'
\|| pprevline=~'^\s*\.[=]\s*$'
\| | pprevline=~'^\s*\\s*$'
设ind=ind-&移位两次
恩迪夫
将“for”子句对齐
如果prevline=~'^\s*\(.*;\s*$)
设ind=ind-&shiftwidth+5
恩迪夫
“在'}'或html上减去'shiftwidth'
设thisline=getline(v:lnum)
如果thisline=~'^\s*[}]'
\| | thisline=~'^\s*]*>'
设ind=ind-&移位两次
恩迪夫
返回ind
端功能
但我不知道这项改变是从哪里开始的。。。试图在SVN历史记录中找到它