让Vim(gVim)更好的支持python语法缩进

来源:互联网 发布:淘宝全球购的入驻条件 编辑:程序博客网 时间:2024/06/06 05:15

python逐渐成为笔者最常用的语言之一,因此vim对python有些配置的不合理也渐渐显现出来,这次我们先来解决python的缩进问题。
我们来通过例子来说明,来看一下默认配置下python的缩进情况:
1.dict的语法缩进

1234
val1 = {        1:"1",        2:"2"        }

2.list的语法缩进

12345
val2 = [        1,        2,        3        ]

3.tuple的语法缩进

12345
val3 = (        1,        2,        3        )

4.函数多行参数的缩进

12345
def fun(        a,        b        ):    print a,b

5.复杂dict中存在):的情况

123456
val4 = {        (            1,            2            ):1        }

很遗憾的发现,这几种常用的写法,默认python缩进都没有完美实现,那么是否有办法优化呢?
答案是有的,vim.org上提供了一款更好的python缩进插件:
http://www.vim.org/scripts/script.php?script_id=974
我们来依次对照一下上面的代码,看新的缩进插件效果怎样:

1.dict的语法缩进

1234
val1 = {    1:"1",    2:"2"}

2.list的语法缩进

12345
val2 = [    1,    2,    3]

3.tuple的语法缩进

12345
val3 = (    1,    2,    3)

4.函数多行参数的缩进

12345
def fun(    a,    b):    print a,b

5.复杂dict中存在):的情况

123456
val4 = {    (        1,        2    ):1}

除了第4条依然表现诡异,其他的缩进应该是比较完美了~
OK,重头戏来了,我们去看源码:
对第117行作出如下修改:

1234567891011121314151617181920212223
"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) + &shiftwidthelse    return indent(parlnum)endif"Mod-End

OK,再来试一下对第4条的缩进如何:

12345
def fun(    a,    b    ):    print a,b

perfect!,哈哈

来说一下修改的方法,简单来说就是判断一下当前行是否为 ):,并且其所对应的(所在的行上是否有 def 关键字,如果同时满足这两个条件,则在(所在行的缩进基础上,再向前缩进一个tab。

提供修改之后的下载链接如下:
http://www.vim.org/scripts/script.php?script_id=3461

OK,就到这里,用vim写python的朋友们,快去试试吧!

原创粉丝点击