31

我在完成 Vim 和 Python 时遇到问题。事实上,我很困惑这是如何工作的。

我有通用 gvim 7.3,在 windows 7 上(使用 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

问题是如果导入行被注释,完成工作(a.<tab> 建议 getX 和 pr)。但它有进口 numpy.random,完成刹车。注意:当我运行代码时,此导入正常工作。

Python完成的先决条件是什么?发生了什么,我应该怎么做才能完成 Python 工作。

由于我(相对)是 Vim 的新手,任何建议都值得赞赏。

编辑: 似乎问题在于在导入中使用 ab 形式。如果我从 numpy 导入随机,一切都很好。如果这很容易解决,我也想让 ab 上班。但现在我知道如何绕过它,这并不重要。

是否还有更多像这样的不寻常问题,以便我知道将来会发生什么?

4

2 回答 2

30

pythoncomplete 相当古老且无人维护。

尝试使用 Jedi:https ://github.com/davidhalter/jedi-vim 它最初是一个改进的 pythoncomplete,但现在更强大了!

它适用于复杂的代码:完成

并具有附加功能: 在此处输入图像描述

列出了所有可能的功能:

  • 内置函数/类支持
  • 复杂的模块/函数/类结构
  • 忽略语法和缩进错误
  • 多重回报/收益率
  • 元组赋值/数组索引/字典索引
  • 异常/with-statement
  • *args / **kwargs
  • 装饰师
  • 描述符 -> 属性/静态方法/类方法
  • 关闭
  • 生成器(yield 语句)/迭代器
  • 支持一些魔术方法:__call__, __iter__, __next__, __get__, __getitem__,__init__
  • 支持 list.append、set.add、list.extend 等。
  • (嵌套)列表推导/三元表达式
  • 相对进口
  • getattr()// __getattr_____getattribute__
  • 函数注释(py3k 功能,现在被忽略,但正在被解析。我不知道如何处理它们。)
  • 类装饰器(py3k 功能,也被忽略,直到我找到一个不适用于 Jedi 的用例)
  • 简单/通常的sys.path修改
  • isinstance检查 if/while/assert
于 2012-10-14T18:51:00.973 回答
5

Python 作为一种令人难以置信的动态语言,并不适合完成。那里没有任何真正好的完成。IMO,没有它的生活比解决所有问题更容易。也就是说, python-mode真的很棒,就像 neoascetic 所说的那样。

于 2012-05-30T10:52:30.137 回答