Vim Python 自动补全

31 投票
2 回答
16582 浏览
提问于 2025-04-16 23:48

我在使用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 个回答

5

Python是一种非常灵活的编程语言,所以它在代码补全方面做得不是很好。市面上没有特别好的补全工具。与其费劲去解决这些问题,不如就不使用补全功能。话虽如此,python-mode确实很棒,正如neoascetic所说的那样。

30

pythoncomplete这个工具比较老旧,而且没有人维护了。

建议你试试Jedi:https://github.com/davidhalter/jedi-vim。它最开始是对pythoncomplete的改进,但现在功能强大得多!

它可以处理复杂的代码:completion

而且还有额外的功能:enter image description here

这里有一个所有可能功能的列表:

  • 支持内置函数和类
  • 可以处理复杂的模块、函数和类结构
  • 能忽略语法和缩进错误
  • 支持多个返回值和生成器
  • 支持元组赋值、数组索引和字典索引
  • 支持异常处理和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语句

撰写回答