让Vim(gVim)更好的支持python语法缩进(强烈推荐)
Published on 二月 22, 2011
python逐渐成为笔者最常用的语言之一,因此vim对python有些配置的不合理也渐渐显现出来,这次我们先来解决python的缩进问题。
我们来通过例子来说明,来看一下默认配置下python的缩进情况:
1.dict的语法缩进
1 2 3 4 | val1 = { 1:"1", 2:"2" } |
2.list的语法缩进
1 2 3 4 5 | val2 = [ 1, 2, 3 ] |
3.tuple的语法缩进
1 2 3 4 5 | val3 = ( 1, 2, 3 ) |
4.函数多行参数的缩进
1 2 3 4 5 | def fun( a, b ): print a,b |
5.复杂dict中存在):的情况
1 2 3 4 5 6 | val4 = { ( 1, 2 ):1 } |
很遗憾的发现,这几种常用的写法,默认python缩进都没有完美实现,那么是否有办法优化呢?
答案是有的,vim.org上提供了一款更好的python缩进插件:
http://www.vim.org/scripts/script.php?script_id=974
我们来依次对照一下上面的代码,看新的缩进插件效果怎样:
1.dict的语法缩进
1 2 3 4 | val1 = { 1:"1", 2:"2" } |
2.list的语法缩进
1 2 3 4 5 | val2 = [ 1, 2, 3 ] |
3.tuple的语法缩进
1 2 3 4 5 | val3 = ( 1, 2, 3 ) |
4.函数多行参数的缩进
1 2 3 4 5 | def fun( a, b ): print a,b |
5.复杂dict中存在):的情况
1 2 3 4 5 6 | val4 = { ( 1, 2 ):1 } |
除了第4条依然表现诡异,其他的缩进应该是比较完美了~
OK,重头戏来了,我们去看源码:
对第117行作出如下修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | "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条的缩进如何:
1 2 3 4 5 | def fun( a, b ): print a,b |
perfect!,哈哈
来说一下修改的方法,简单来说就是判断一下当前行是否为 ):,并且其所对应的(所在的行上是否有 def 关键字,如果同时满足这两个条件,则在(所在行的缩进基础上,再向前缩进一个tab。
提供修改之后的下载链接如下:
http://www.vim.org/scripts/script.php?script_id=3461
OK,就到这里,用vim写python的朋友们,快去试试吧!
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=1990
mark。学习python中
[回复]
[...] 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 [...]
Life Changing~~
[回复]
说实话 不会perl and python 强烈想学,用来管理系统!
[回复]
Dante 回复:
二月 23rd, 2011 at 11:16 下午
呵呵, 推荐学一下,如果熟悉其他高级语言的话,python入门一般就一下午就足够了,剩下的就是在实践中联系了~
[回复]
madper 回复:
二月 24th, 2011 at 8:23 下午
但是perl学半个月也还是看不多别人写的各种小脚本…
[回复]
Dante 回复:
二月 25th, 2011 at 12:20 上午
perl我也没有怎么学过,只知道perl与python的理念是不同的。
python:
任何事情都有且只有一个最好的方法
perl:
条条大路通罗马
python很简单,我当时学python的入门就只用了一下午,然后就用django去开发公司项目去了。。
[回复]
谢谢,有用。
[回复]
可以推荐一下学习python的资料吗?
谢谢!
[回复]
Dante 回复:
二月 26th, 2011 at 9:01 下午
我记得当时是学的一本《python简明教程》,很简短的一本电子书,看完基本就入门了;再然后发现那本书讲的太浅了,就又看了《python核心编程》,后来就直接用django开发项目,在项目中学习了。
[回复]
依云 回复:
二月 26th, 2011 at 9:50 下午
只看 Python 官方文档的路过~
[回复]
zyp 回复:
二月 27th, 2011 at 3:34 下午
谢谢!
[回复]
很不错,但是关键字传参缩进还是不行。现在是这样的:
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 回复:
二月 26th, 2011 at 11:02 下午
目前的缩进是这样的:
个人比较喜欢这种缩进方式的,不知道你贴的缩进是啥,因为评论里的缩进都被去掉了。。
[回复]
marlonyao 回复:
二月 26th, 2011 at 11:03 下午
回复不能处理缩进,看这里:http://codepad.org/SgNZUkew
[回复]
Dante 回复:
二月 26th, 2011 at 11:14 下午
哦,第二种缩进很像Vim对C代码的处理,不过个人觉得按照第一种那样按照参数名对齐更好看一点……
[回复]
脚本里面的 setlocal expandtab 太暴力了吧,个人暂时习惯用4空格的tab,只要不是贴来贴去,问题不大
[回复]
Dante 回复:
三月 7th, 2011 at 12:13 上午
哈,一般python都是推荐用空格的吧?我现在为了统一格式,除了makefile非用tab不可外,其他语言都用4个空格代替tab了~
[回复]
再次请教一个问题,
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 回复:
三月 26th, 2011 at 8:28 下午
用正则替换一句就可以了~
可以看一下:
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 回复:
三月 27th, 2011 at 12:23 上午
看来我用的录制宏的法子笨了哈。非常感谢哈。博主V5
[回复]
还得请教一个问题,我想设置自动断行。
网上指令是
set textwidth=70 但是我设置了,却没有任何效果,还是会键入一个很长的行啊。我已经关闭兼容模式了。求指点
[回复]
Dante 回复:
三月 29th, 2011 at 9:47 上午
呃,需要中间有空格才会自动断行,如果想要单词从中间断掉好像有一个设置,想不起来了,看看是不是有其他博友知道?
[回复]
依云 回复:
三月 29th, 2011 at 11:01 下午
如果你要断一个非常非常长的英文单词,
如果是中文的话,
[回复]
太好了,早就觉得Vim对Python的缩进不太爽了,学习了,多谢~
[回复]
使用之后,代码的缩进风格和没有使用的时候很不一样,甚至造成了错误。比如原先回车到下一行后新生成的缩进是一个Tab的话,使用了这个插件后会把缩进变成4个空格(举个例子)造成编译不过。缩进方式不统一了。
不知道是不是这个问题,一处插件后问题修复了。不过考虑一下如果缩进不统一(比如把一个Tab换成4个空格)就会造成编译不过,那大家都不可能协作了啊。。所以,求指点
[回复]