Как добавить автозаполнение в Vim для нестандартных библиотек Python? - PullRequest
5 голосов
/ 12 ноября 2011

Например, у меня есть скрипт Python, использующий Google App Engine SDK:

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 ]

3 голосов
/ 15 ноября 2011

Вам необходимо добавить свои библиотечные файлы в файл тегов.Например, если вы установили Google App Engine через pip в виртуальной среде, расположенной в env /:

virtualenv --no-site-package env/
source env/bin/activate
pip install google_appengine

..., вы должны выполнить:

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

Если выне устанавливал google_appengine через pip, тогда вы должны найти путь к своим библиотекам python (подсказка: он должен быть указан в $ PYTHONPATH. И согласно этой справочной странице: "в Unix это обычно:/ usr / local / lib / python. ") и замените env / на путь, который вы нашли.

Наконец, ваш файл .vimrc должен проанализировать ваш файл тегов.Например, в моем .vimrc у меня есть:

set tags+=/path/to/my/tags
1 голос
/ 24 мая 2012

Я взял это из natws vimrc (я думаю ... может быть, sontek), но это должно сработать, если ваши пакеты доступны для вашей текущей установки Python. Это позволяет вам использовать gf, но также настраивает поиск этих файлов для автозаполнения. Обратите внимание на часть py <<EOF, которая начинает раздел, интерпретируемый в Python. Это означает, что для его использования вам потребуется установить интерпретатор python в vim.

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' на данный момент).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...