让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的朋友们,快去试试吧!

posted @ 2019-12-10 16:23  汉学  阅读(194)  评论(0编辑  收藏  举报