現在のpython#completeは、次のimportステートメントを含むPythonスクリプトをサポートしていません。
from . import module
from .modulea import abc
vimに「from:syntaxerror...」と表示されます。
誰かがそれを解決するための手がかりを持っていますか?
今日は、pythoncompleteスクリプトを実行して、この問題を自分で解決するために時間を費やしています。_parsedotname関数をハックすることで解決できました。'。'の変換に関する問題が原因で、ハッキングがどれほど移植可能かわかりません。絶対パスになりますが、私のマシンでは機能します。以下は私の変更点です(ええ、コードフローを理解するために使用する印刷ステートメントがたくさんあります...)
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