【问题标题】:How can I add autocomplete to Vim for non-standard Python libraries?如何在 Vim 中为非标准 Python 库添加自动完成功能?
【发布时间】:2012-05-24 05:16:17
【问题描述】:

例如,我有一个使用 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 自动补全可以找到它们?并显示他们的文档字符串?

【问题讨论】:

    标签: python vim autocomplete


    【解决方案1】:

    您需要将库文件添加到标签文件中。例如,如果您通过 pip 在位于 env/ 的虚拟环境中安装了 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
    

    【讨论】:

    • 如果我不使用pip会怎样?说,只是做点图书馆的路径之类的事情?这是什么程序?
    【解决方案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”的任何内容)。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      相关资源
      最近更新 更多