如何为非标准Python库在Vim中添加自动完成?

5 投票
2 回答
2021 浏览
提问于 2025-04-17 06:09

比如,我有一个使用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.KTab

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

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

我该怎么做才能把非标准Python库的路径加进去,这样Vim的自动补全才能找到它们?还有,怎么让它显示它们的文档字符串?

2 个回答

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')。

4

你需要把你的库文件添加到标签文件中。比如说,如果你在一个叫做 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 中显示。根据 这个参考页面:“在 Unix 系统上,这通常是 .:/usr/local/lib/python.”),然后把 env/ 替换成你找到的路径。

最后,你的 .vimrc 文件应该能够解析你的标签文件。比如在我的 .vimrc 中,我有:

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

撰写回答