当前的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
答案 0 :(得分:1)
我想你正在使用vim内部pythoncomplete
。
正如我在这里写的那样:Python docstring with vim pythoncomplete is not displaying newlines for my own class functions
pythoncomplete
是一个非常简单的工具,它通过执行import
语句来完成大部分的完成(顺便说一句,这非常危险)。解决它可能不是最好的主意,因为我正在尝试这样做(写一个好 python自动完成)。
但我不认为我的版本会在一两个月内做好你想做的事情,但它已经很远了,我会在你准备好的时候告诉你。