让Vim(gVim)更好的支持python语法缩进(转)
原文地址:http://www.vimer.cn/!1JA/
python逐渐成为笔者最常用的语言之一,因此vim对python有些配置的不合理也渐渐显现出来,这次我们先来解决python的缩进问题。 我们来通过例子来说明,来看一下默认配置下python的缩进情况:
1.dict的语法缩进
val1 = {
1:"1",
2:"2"
}
2.list的语法缩进
val2 = [
1,
2,
3
]
3.tuple的语法缩进
val3 = (
1,
2,
3
)
4.函数多行参数的缩进
def fun(
a,
b
):
print a,b
5.复杂dict中存在):的情况
val4 = {
(
1,
2
):1
}
很遗憾的发现,这几种常用的写法,默认python缩进都没有完美实现,那么是否有办法优化呢? 答案是有的,vim.org上提供了一款更好的python缩进插件: http://www.vim.org/scripts/script.php?script_id=974
我们来依次对照一下上面的代码,看新的缩进插件效果怎样:
1.dict的语法缩进
val1 = {
1:"1",
2:"2"
}
2.list的语法缩进
val2 = [
1,
2,
3
]
3.tuple的语法缩进
val3 = (
1,
2,
3
)
4.函数多行参数的缩进
def fun(
a,
b
):
print a,b
5.复杂dict中存在):的情况
val4 = {
(
1,
2
):1
}
除了第4条依然表现诡异,其他的缩进应该是比较完美了~ OK,重头戏来了,我们去看源码: 对第117行作出如下修改:
"Mod-Begin by dantezhu in 2011-02-21 23:38:24
"FROM
"return indent(parlnum)
"TO
"为了支持如下的格式:
"def fun(
" a,
" b
" ):
" print a,b
"又不影响如下格式:
"val = {
" (
" 1,
" 2
" ):1
"}
if match(getline(a:lnum), ')\s*:') != -1 && match(getline(parlnum), 'def\s\+') != -1
return indent(parlnum) + &shiftwidth
else
return indent(parlnum)
endif
"Mod-End
OK,再来试一下对第4条的缩进如何:
def fun(
a,
b
):
print a,b
perfect!,哈哈 来说一下修改的方法,简单来说就是判断一下当前行是否为 ):,并且其所对应的(所在的行上是否有 def 关键字,如果同时满足这两个条件,则在(所在行的缩进基础上,再向前缩进一个tab。 提供修改之后的下载链接如下: http://www.vim.org/scripts/script.php?script_id=3461
OK,就到这里,用vim写python的朋友们,快去试试吧!