因为pythoncomplete是依靠exec一句句执行原文件中的代码然后进行代码提示的,所以就需要所有用到的对象都必须被import进来。所以如果你在当前原文件中定义一个类,然后就创建实例是没有提示的。例如:
class Foo(object):
name = 'lucifer'
f = Foo()
f.这里会失败
解决的方法很简单就是手动导入这个类,比如我们的原文件名字叫tt.py,那么就加入这句:from tt import Foo,代码提示就能正常工作了。因此补丁也很简单。打开autoload下的pythoncomplete.vim文件,在python << PYTHONEOF下面加入
import vim
import os, re
然后在class Completer(object):前面加入以下两句用于获取当前文件的文件名
filename = os.path.basename(vim.buffers[0].name)
filename = filename[0:-3]
再在函数 def evalsource(self,text,line=0):中接着上次增加的namespace后面加入
if not namespace:
for item in src.split('/n'):
if item.startswith('from') or item.startswith('import'):
namespace.append(item)
# 获取当前文件中定义的class名称
if item.startswith('class') and item.endswith(':'):
regex = re.compile(r'^class/s+(?P<name>.+?)/(.+?/):$')
matchs = regex.findall(item)
if len(matchs):
name = matchs[0]
from_import = 'from %s import %s' % (filename, name)
namespace.append(from_import)