Окончание Vim Python

У меня возникают проблемы с завершением Vim и Python. На самом деле я совершенно смущен, как это работает.

У меня есть общий gvim 7.3, на Windows 7 (с python/dyn) Я использую плагин SuperTab, среди многих других, некоторые из которых являются специфичными для python, со следующими настройками в vimrc:

au FileType python set omnifunc=pythoncomplete#Complete
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabContextDefaultCompletionType = "<c-n>"

Я не устанавливал переменную PYTHONPATH varariable.

Завершение работ выполняется для системных модулей.

Сначала я подумал, что он вообще не работает для несистемных кода, но это не так. То, что происходит, лучше всего показывать по следующему коду:

import numpy.random   # if this line is commented completion in last line works

class C(object):
    def __init__(self, x_):
        self.x=x_

    def getX(self):
        return self.x

    def pr(self):
        print 'ok'

a=C(10)  # nothing changes if I put C() instead, even though it would be wrong
a.  # here is completion in question

Проблема заключается в том, что завершение работы (a. <tab> предлагает getX и pr), если строка импорта прокомментирована. Но это есть импорт numpy.random, завершение тормозов вниз. Примечание: этот импорт работает нормально, когда я запускаю код.

Каковы предпосылки для завершения Python? Что происходит и что мне нужно сделать, чтобы завершить работу для Python.

Поскольку я (относительно) новичок в Vim, любое предложение оценивается.

EDIT: Похоже, проблема заключается в использовании формы a.b в импорте. Если я делаю из numpy import random, все в порядке. Если это разумно легко исправить, я хотел бы получить a.b для работы. Но теперь, когда я знаю, как обойти это, это не так важно.

Есть ли более необычная проблема, подобная этой, чтобы я знал, что происходит в будущем?

Ответ 1

pythoncomplete довольно старен и не поддерживается.

Попробуйте использовать Jedi: https://github.com/davidhalter/jedi-vim Первоначально это был улучшенный pythoncomplete, но теперь он намного более мощный!

Он работает для сложного кода: completion

И имеет дополнительные функции: enter image description here

Существует список всех возможных возможностей:

  • встроенные функции/классы поддержка
  • сложные структуры модулей/функций/классов
  • игнорирует ошибки синтаксиса и отступов
  • несколько возвратов/выходов
  • присвоения кортежей/индексирование индексов/индексация словаря
  • exceptions/with-statement
  • * args/** kwargs
  • декораторы
  • дескрипторы → свойство /staticmethod/classmethod
  • закрытие
  • генераторы (оператор yield)/iterators
  • поддержка некоторых магических методов: __call__, __iter__, __next__, __get__, __getitem__, __init__
  • поддержка list.append, set.add, list.extend и т.д.
  • (вложенный) список/тернарные выражения
  • относительный импорт
  • getattr()/__getattr__/__getattribute__
  • функциональные аннотации (функция py3k, игнорируются прямо сейчас, но анализируются. Я не знаю, что с ними делать.) Декораторы класса
  • (функция py3k тоже игнорируются, пока не найду использование случай, который не работает с джедаями)
  • простые/обычные sys.path модификации
  • isinstance проверяет, есть ли /while/assert

Ответ 2

Python, будучи невероятно динамичным языком, не поддается завершению. Там нет действительно хорошего завершения. Легче просто жить без него, чем бороться со всеми его проблемами, ИМО. Тем не менее, python-mode действительно фантастически, как сказал неоасетический.