如何为非标准Python库向Vim添加自动完成功能?

时间:2011-11-12 00:38:48

标签: python vim autocomplete

例如,我有一个使用Google App Engine SDK的Python脚本:

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app

模块db有一个子模块Key,所以我尝试在其上使用自动完成功能:

db.K 标签

但是在Vim窗口的底部,我得到以下内容:

-- Omni completion (^O^N^P) Pattern not found

如何包含非标准Python库的路径,以便Vim自动完成可以找到它们?还要展示他们的文档字符串?

2 个答案:

答案 0 :(得分:3)

您需要将库文件添加到代码文件中。例如,如果您在位于env /:

的虚拟环境中通过pip安装了Google App Engine
virtualenv --no-site-package env/
source env/bin/activate
pip install google_appengine

...然后你应该执行:

ctags -R --python-kinds=-i -o tags env/

如果你没有通过pip安装google_appengine,那么你应该找到你的python库的路径(提示:它应该由$ PYTHONPATH表示。并且根据this参考页面:“在Unix上,这是通常。:/ usr / local / lib / python。“)并用您找到的路径替换env /。

最后,您的.vimrc文件应该解析您的标记文件。例如,在我的.vimrc中,我有:

set tags+=/path/to/my/tags

答案 1 :(得分:1)

我从natw的vimrc(我想......也许是sontek)中抓住了这个,但它应该可以解决这个问题,只要你的软件包可以通过你当前的Python安装找到。这允许您使用gf,但也设置搜索这些文件以进行自动完成。注意py <<EOF部分,它开始用Python解释的部分。这意味着您必须在vim中安装python解释器才能使用它。

function! LoadPythonPath() 
py <<EOF
    # load PYTHONPATH into vim, this lets you hover over a module name
    # and type 'gf' (for goto file) and open that file in vim. Useful
    # and easier than rope for simple tasks 
    import os.path 
    import sys 
    import vim 
    for p in sys.path:
        if os.path.isdir(p):
            vim.command(r"set path+=%s" % (p.replace(" ", r"\ "))) 
EOF

    endfunction

顺便说一下,我不喜欢自动加载这个,所以我把它设置为一个函数,当我调用它/首先输入一个Python文档时,它会智能地加载/卸载。我在上一个函数中添加let g:PythonPathLoaded=1

function! GetPythonPath()
    if !exists("g:PythonPathLoaded")
        call LoadPythonPath()
        return
    elseif g:PythonPathLoaded
        return
    else
        call LoadPythonPath()
    endif
endfunction

我也有卸载功能......虽然我不确定这是否会产生巨大的影响。

function! UnloadPythonPath()

py <<EOF
    # load PYTHONPATH into vim, this lets you hover over a module name
    # and type 'gf' (for goto file) and open that file in vim. Useful
    # and easier than rope for simple tasks
for p in sys.path:
    if os.path.isdir(p):
        vim.command(r"set path-=%s" % (p.replace(" ", r"\ ")))
EOF

    let g:PythonPathLoaded = 0
endfunction

希望这有帮助!另外,一个额外的好处是,无论你是否使用virtualenv,它都会加载你的软件包(因为它,我认为,此时运行的是'python')。