如何为非标准Python库在Vim中添加自动完成?
比如,我有一个使用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
Tab
但是在Vim窗口的底部,我看到以下内容:
-- Omni completion (^O^N^P) Pattern not found
我该怎么做才能把非标准Python库的路径加进去,这样Vim的自动补全才能找到它们?还有,怎么让它显示它们的文档字符串?
2 个回答
我从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')。
你需要把你的库文件添加到标签文件中。比如说,如果你在一个叫做 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