Vim Python 自动补全
我在使用Vim和Python的自动补全功能时遇到了一些麻烦。其实我对这个功能是怎么运作的完全搞不清楚。
我在Windows 7上使用的是普通的gvim 7.3(带有python/dyn),同时安装了SuperTab插件,还有其他一些插件,其中一些是专门针对Python的。我在vimrc中设置了以下内容:
au FileType python set omnifunc=pythoncomplete#Complete
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabContextDefaultCompletionType = "<c-n>"
我没有设置PYTHONPATH这个环境变量。
对于系统模块,自动补全功能是正常的。
起初我以为对于非系统代码,自动补全根本不工作,但事实并非如此。下面的代码最能说明问题:
import numpy.random # if this line is commented completion in last line works
class C(object):
def __init__(self, x_):
self.x=x_
def getX(self):
return self.x
def pr(self):
print 'ok'
a=C(10) # nothing changes if I put C() instead, even though it would be wrong
a. # here is completion in question
问题是,当import行被注释掉时,补全功能是可以工作的(比如输入a.<tab>会建议getX和pr)。但是如果有import numpy.random,补全就会失效。注意:这个import在我运行代码时是正常工作的。
那么,Python的自动补全需要什么前提条件呢?发生了什么,我该怎么做才能让Python的补全功能正常工作。
因为我对Vim(相对)比较陌生,所以任何建议都很受欢迎。
编辑:看来问题出在使用a.b这种形式的import上。如果我用from numpy import random,一切都正常。如果这个问题比较简单可以解决,我也希望能让a.b这种形式的import正常工作。不过现在我知道怎么绕过这个问题,所以这也不是那么重要了。
像这样的其他不寻常的问题还有吗?这样我以后就能知道发生了什么。
2 个回答
Python是一种非常灵活的编程语言,所以它在代码补全方面做得不是很好。市面上没有特别好的补全工具。与其费劲去解决这些问题,不如就不使用补全功能。话虽如此,python-mode确实很棒,正如neoascetic所说的那样。
pythoncomplete这个工具比较老旧,而且没有人维护了。
建议你试试Jedi:https://github.com/davidhalter/jedi-vim。它最开始是对pythoncomplete的改进,但现在功能强大得多!
它可以处理复杂的代码:
而且还有额外的功能:
这里有一个所有可能功能的列表:
- 支持内置函数和类
- 可以处理复杂的模块、函数和类结构
- 能忽略语法和缩进错误
- 支持多个返回值和生成器
- 支持元组赋值、数组索引和字典索引
- 支持异常处理和with语句
- 支持可变参数(*args)和关键字参数(**kwargs)
- 支持装饰器
- 支持描述符,比如属性、静态方法和类方法
- 支持闭包
- 支持生成器(yield语句)和迭代器
- 支持一些特殊方法,比如
__call__
、__iter__
、__next__
、__get__
、__getitem__
、__init__
- 支持列表的append、集合的add、列表的extend等操作
- 支持(嵌套的)列表推导式和三元表达式
- 支持相对导入
- 支持
getattr()
、__getattr__
和__getattribute__
- 支持函数注解(这是Python 3的特性,现在被忽略,但正在解析中。我还不知道该怎么处理它们。)
- 支持类装饰器(也是Python 3的特性,目前也被忽略,直到我找到一个不适用于Jedi的用例)
- 简单的
sys.path
修改 - 支持
isinstance
检查,用于if、while和assert语句