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

2.list的语法缩进

3.tuple的语法缩进

4.函数多行参数的缩进

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

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

1.dict的语法缩进

2.list的语法缩进

3.tuple的语法缩进

4.函数多行参数的缩进

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

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

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

perfect!,哈哈

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

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

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

python单进程能否利用多核cpu的测试结论

在很早的时候,就听网上的文章说: python有GIL,所以在单进程内,即使使用多线程也无法利用到多核的优势,同一时刻,python的字节码只会运行在一个cpu上。 ...

阅读全文

python常用web框架性能测试(django,flask,bottle,tornado)

测了一下django、flask、bottle、tornado 框架本身最简单的性能。对django的性能完全无语了。 django、flask、bottle 均使用gunicorn+gevent启动...

阅读全文

手机应用/服务器开发的一些总结(一)

经过这么久在android客户端和服务器端的开发,感觉还是积累了不少东西想要和大家分享一下,但是好想单独拎一个点出来又不太值得,所以就汇集到一起写成系列吧...

阅读全文

30则回应给“让Vim(gVim)更好的支持python语法缩进(强烈推荐)”

  1. freetstar说道:

    mark。学习python中

    [回复]

  2. 依云说道:

    Life Changing~~

    [回复]

  3. 君临天下说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    madper 回复:

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

    [回复]

    Dante 回复:

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

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

    [回复]

  4. icyomik说道:

    谢谢,有用。

    [回复]

  5. zyp说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    依云 回复:

    只看 Python 官方文档的路过~

    [回复]

    zyp 回复:

    谢谢!

    [回复]

  6. marlonyao说道:

    很不错,但是关键字传参缩进还是不行。现在是这样的:
    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'])

    [回复]

    Dante 回复:

    目前的缩进是这样的:

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

    [回复]

    marlonyao 回复:

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

    [回复]

    Dante 回复:

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

    [回复]

  7. fanhe说道:

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

    [回复]

    Dante 回复:

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

    [回复]

  8. prife说道:

    再次请教一个问题,
    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代码,比如我想交换上面代码中 = 号两边变量位置,每次我都是录制宏,麻烦死了,有没有可以定义成命令或者脚本的方案,可以不用每次都录制一边的法子 么?

    [回复]

    Dante 回复:

    用正则替换一句就可以了~
    可以看一下:
    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

    [回复]

    prife 回复:

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

    [回复]

  9. prife说道:

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

    [回复]

    Dante 回复:

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

    [回复]

    依云 回复:

    如果你要断一个非常非常长的英文单词,

    如果是中文的话,

    [回复]

  10. py_zhu说道:

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

    [回复]

  11. udonmai说道:

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

    [回复]

  12. etflly说道:

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

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

    [回复]

  13. liangzi说道:

    好用。谢谢~

    [回复]

  14. 龙龙FRED说道:

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

    [回复]

  15. 乌鸦说道:

    弱弱的问他一句,如何在自己的.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 可依然没有自动缩进,最终的缩进效果只是和上一行保持一致

    [回复]

发表评论