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的朋友们,快去试试吧!
freetstar on #
mark。学习python中
Reply
依云 on #
Life Changing~~
Reply
君临天下 on #
说实话 不会perl and python 强烈想学,用来管理系统!
Reply
Dante on #
呵呵, 推荐学一下,如果熟悉其他高级语言的话,python入门一般就一下午就足够了,剩下的就是在实践中联系了~
Reply
madper on #
但是perl学半个月也还是看不多别人写的各种小脚本...
Reply
Dante on #
perl我也没有怎么学过,只知道perl与python的理念是不同的。
python:
任何事情都有且只有一个最好的方法
perl:
条条大路通罗马
python很简单,我当时学python的入门就只用了一下午,然后就用django去开发公司项目去了。。
Reply
icyomik on #
谢谢,有用。
Reply
zyp on #
可以推荐一下学习python的资料吗?
谢谢!
Reply
Dante on #
我记得当时是学的一本《python简明教程》,很简短的一本电子书,看完基本就入门了;再然后发现那本书讲的太浅了,就又看了《python核心编程》,后来就直接用django开发项目,在项目中学习了。
Reply
依云 on #
只看 Python 官方文档的路过~
Reply
zyp on #
谢谢!
Reply
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
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
marlonyao on #
回复不能处理缩进,看这里:http://codepad.org/SgNZUkew
Reply
Dante on #
哦,第二种缩进很像Vim对C代码的处理,不过个人觉得按照第一种那样按照参数名对齐更好看一点……
Reply
fanhe on #
脚本里面的 setlocal expandtab 太暴力了吧,个人暂时习惯用4空格的tab,只要不是贴来贴去,问题不大
Reply
Dante on #
哈,一般python都是推荐用空格的吧?我现在为了统一格式,除了makefile非用tab不可外,其他语言都用4个空格代替tab了~
Reply
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
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
prife on #
看来我用的录制宏的法子笨了哈。非常感谢哈。博主V5
Reply
prife on #
还得请教一个问题,我想设置自动断行。
网上指令是
set textwidth=70 但是我设置了,却没有任何效果,还是会键入一个很长的行啊。我已经关闭兼容模式了。求指点
Reply
Dante on #
呃,需要中间有空格才会自动断行,如果想要单词从中间断掉好像有一个设置,想不起来了,看看是不是有其他博友知道?
Reply
依云 on #
如果你要断一个非常非常长的英文单词,
<pre>:h 'lbr'</pre>
如果是中文的话,
<pre>:h fo-table</pre>
Reply
py_zhu on #
太好了,早就觉得Vim对Python的缩进不太爽了,学习了,多谢~
Reply
udonmai on #
使用之后,代码的缩进风格和没有使用的时候很不一样,甚至造成了错误。比如原先回车到下一行后新生成的缩进是一个Tab的话,使用了这个插件后会把缩进变成4个空格(举个例子)造成编译不过。缩进方式不统一了。
不知道是不是这个问题,一处插件后问题修复了。不过考虑一下如果缩进不统一(比如把一个Tab换成4个空格)就会造成编译不过,那大家都不可能协作了啊。。所以,求指点
Reply
etflly on #
修改过的格式用vim-flake8检测会报E125错误:
E125 continuation line does not distinguish itself from next logical line
不过我还没自己看过PEP8对此是怎么规定的,改天去翻一下……
Reply
liangzi on #
好用。谢谢~
Reply
龙龙FRED on #
把插件丢进indent就可以了么?需要开启么?
Reply
乌鸦 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