Vim python#complete不适用于“from .module import”语句

时间:2012-05-07 17:11:32

标签: python vim autocomplete

当前的python#complete不支持任何带有以下import语句的python脚本:

from . import module
from .modulea import abc

它将在vim中显示“from:syntax error ...”。

任何人都有任何解决方法吗?

我今天花了一些时间来通过pythoncomplete脚本来解决这个问题。我能够通过_parsedotname函数的一些黑客来解决它。由于转换'。'的问题,我不确定我的黑客行为有多便携。进入绝对路径,但它在我的机器上工作。以下是我的更改(是的,你看到很多我用它来理解代码流的print语句......)

def _parsedotname(self,pre=None):
    #returns (dottedname, nexttoken)
    name = []
    absolute_relative_path = False
    if pre is None:
        tokentype, token, indent = self.next()
        #print tokentype, token, indent
        if tokentype == 51 and token == '.':
            import os
            import sys
            #print os.path.abspath(os.curdir)
            fullpath = os.path.abspath(os.curdir)
            paths = fullpath.split(os.path.sep) 
            n_ = -1
            #print fullpath
            pyexeindex = sys.path.index(os.path.dirname(sys.executable))
            #print sys.path[pyexeindex:]
            while fullpath not in sys.path[pyexeindex:]:
                fullpath = os.path.sep.join(paths[:n_])
                #print fullpath
                n_ -= 1
            if fullpath == '':
                return ('', token)
            absolute_relative_path = True
            name = '.'.join(paths[n_+1:])
            #print name
        elif tokentype != NAME and token != '*':
            #print 'should not here'
            return ('', token)
    else: token = pre
    if '.' in name:
        name = name.split('.')
    else:
        name.append(token)

    while True:
        if not absolute_relative_path:
            tokentype, token, indent = self.next()
            if token != '.': break
        tokentype, token, indent = self.next()
        if not absolute_relative_path:
            if tokentype != NAME: break
        else:
            absolute_relative_path = False
            if tokentype == NAME and token == 'import':
                return (".".join(name), token)
        name.append(token)
    return (".".join(name), token)

现在,它适用于两者:

from . import module
from .moduleA import moduleB

1 个答案:

答案 0 :(得分:1)

我想你正在使用vim内部pythoncomplete

正如我在这里写的那样:Python docstring with vim pythoncomplete is not displaying newlines for my own class functions

pythoncomplete是一个非常简单的工具,它通过执行import语句来完成大部分的完成(顺便说一句,这非常危险)。解决它可能不是最好的主意,因为我正在尝试这样做(写一个 python自动完成)。

但我不认为我的版本会在一两个月内做好你想做的事情,但它已经很远了,我会在你准备好的时候告诉你。