Окончание 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 действительно фантастически, как сказал неоасетический.