最后更新于 .

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

Pingbacks

  1. 让Vim(gVim)更好的支持python语法缩进 zZ « 葡萄树 On The Ro on #

    [...] http://www.vimer.cn/2011/02/%e8%ae%a9vimgvim%e6%9b%b4%e5%a5%bd%e7%9a%84%e6%94%af%e6%8c%81python%e8%a... 标签: python, vim [...]

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. freetstar

    freetstar on #

    mark。学习python中

    Reply

  2. 依云

    依云 on #

    Life Changing~~

    Reply

  3. 君临天下

    君临天下 on #

    说实话 不会perl and python 强烈想学,用来管理系统!

    Reply

    1. Dante

      Dante on #

      呵呵, 推荐学一下,如果熟悉其他高级语言的话,python入门一般就一下午就足够了,剩下的就是在实践中联系了~

      Reply

      1. madper

        madper on #

        但是perl学半个月也还是看不多别人写的各种小脚本...

        Reply

        1. Dante

          Dante on #

          perl我也没有怎么学过,只知道perl与python的理念是不同的。
          python:
          任何事情都有且只有一个最好的方法
          perl:
          条条大路通罗马

          python很简单,我当时学python的入门就只用了一下午,然后就用django去开发公司项目去了。。

          Reply

  4. icyomik

    icyomik on #

    谢谢,有用。

    Reply

  5. zyp

    zyp on #

    可以推荐一下学习python的资料吗?
    谢谢!

    Reply

    1. Dante

      Dante on #

      我记得当时是学的一本《python简明教程》,很简短的一本电子书,看完基本就入门了;再然后发现那本书讲的太浅了,就又看了《python核心编程》,后来就直接用django开发项目,在项目中学习了。

      Reply

    2. 依云

      依云 on #

      只看 Python 官方文档的路过~

      Reply

    3. zyp

      zyp on #

      谢谢!

      Reply

  6. marlonyao

    marlonyao on #

    很不错,但是关键字传参缩进还是不行。现在是这样的:
    user = User.create_user(email=self.cleaned_data['email'],
    password=self.cleaned_data['password'],
    name = self.cleaned_data['name'])

    但是我期望是:
    user = User.create_user(email=self.cleaned_data['email'],
    password=self.cleaned_data['password'],
    name = self.cleaned_data['name'])

    Reply

    1. Dante

      Dante on #

      目前的缩进是这样的:

      <pre lang="python" line="1">
      user = User.create_user(email=self.cleaned_data['email'],
      password=self.cleaned_data['password'],
      name = self.cleaned_data['name'])
      </pre>

      个人比较喜欢这种缩进方式的,不知道你贴的缩进是啥,因为评论里的缩进都被去掉了。。

      Reply

    2. marlonyao

      marlonyao on #

      回复不能处理缩进,看这里:http://codepad.org/SgNZUkew

      Reply

      1. Dante

        Dante on #

        哦,第二种缩进很像Vim对C代码的处理,不过个人觉得按照第一种那样按照参数名对齐更好看一点……

        Reply

  7. fanhe

    fanhe on #

    脚本里面的 setlocal expandtab 太暴力了吧,个人暂时习惯用4空格的tab,只要不是贴来贴去,问题不大

    Reply

    1. Dante

      Dante on #

      哈,一般python都是推荐用空格的吧?我现在为了统一格式,除了makefile非用tab不可外,其他语言都用4个空格代替tab了~

      Reply

  8. prife

    prife on #

    再次请教一个问题,
    MaxSpeed=focustempbuf[0];//最大速率
    BeepVolumeList=focustempbuf[1]; //音量DB
    BlockPressure=focustempbuf[2];//阻塞压力
    KVO_Value=focustempbuf[3];//KVO数值
    RemainAlarmValue=focustempbuf[4];//残留报警数值
    RemainAlarmList=focustempbuf[5];//残留报警单位
    FastMoveSpeed=focustempbuf[6];//快进偈
    用gvim写c代码,比如我想交换上面代码中 = 号两边变量位置,每次我都是录制宏,麻烦死了,有没有可以定义成命令或者脚本的方案,可以不用每次都录制一边的法子 么?

    Reply

    1. Dante

      Dante on #

      用正则替换一句就可以了~
      可以看一下:
      http://www.vimer.cn/2010/01/%E5%88%A9%E7%94%A8vim%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%E8%87%AA%E5%8A%A8%E5%8C%B9%E9%85%8D%E5%AE%8C%E6%88%90%EF%BC%88%E7%AD%89%E5%8F%B7.html

      Reply

      1. prife

        prife on #

        看来我用的录制宏的法子笨了哈。非常感谢哈。博主V5

        Reply

  9. prife

    prife on #

    还得请教一个问题,我想设置自动断行。
    网上指令是
    set textwidth=70 但是我设置了,却没有任何效果,还是会键入一个很长的行啊。我已经关闭兼容模式了。求指点

    Reply

    1. Dante

      Dante on #

      呃,需要中间有空格才会自动断行,如果想要单词从中间断掉好像有一个设置,想不起来了,看看是不是有其他博友知道?

      Reply

    2. 依云

      依云 on #

      如果你要断一个非常非常长的英文单词,
      <pre>:h 'lbr'</pre>
      如果是中文的话,
      <pre>:h fo-table</pre>

      Reply

  10. py_zhu

    py_zhu on #

    太好了,早就觉得Vim对Python的缩进不太爽了,学习了,多谢~

    Reply

  11. udonmai

    udonmai on #

    使用之后,代码的缩进风格和没有使用的时候很不一样,甚至造成了错误。比如原先回车到下一行后新生成的缩进是一个Tab的话,使用了这个插件后会把缩进变成4个空格(举个例子)造成编译不过。缩进方式不统一了。
    不知道是不是这个问题,一处插件后问题修复了。不过考虑一下如果缩进不统一(比如把一个Tab换成4个空格)就会造成编译不过,那大家都不可能协作了啊。。所以,求指点

    Reply

  12. etflly

    etflly on #

    修改过的格式用vim-flake8检测会报E125错误:
    E125 continuation line does not distinguish itself from next logical line

    不过我还没自己看过PEP8对此是怎么规定的,改天去翻一下……

    Reply

  13. liangzi

    liangzi on #

    好用。谢谢~

    Reply

  14. 龙龙FRED

    龙龙FRED on #

    把插件丢进indent就可以了么?需要开启么?

    Reply

  15. 乌鸦

    乌鸦 on #

    弱弱的问他一句,如何在自己的.vimrc中引用ptyhon.vim呢?我用了:filetype onfiletype indent onfiletype indent plugin onfiletype plugin onfiletype plugin indent onautocmd FileWritePre,BufNewFile,BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class,set nocompatible 可依然没有自动缩进,最终的缩进效果只是和上一行保持一致

    Reply

发表评论