Omnicompletion Vim с Python просто не работает - PullRequest
50 голосов
/ 18 января 2010

Я искал около часа, как по переполнению стека, так и в других местах. Увы! Пожалуйста помоги. Omnompletion Vim просто не работает .

  1. У меня Vim 7.2 скомпилирован с поддержкой Python.

  2. filetype plugin on в моем .vimrc.

  3. Когда файл .py открыт, :echo &omnifunc печатает pythoncomplete#Complete.

  4. Я работаю с большим проектом, и у меня есть файл tags, созданный с помощью exhuberant-ctags. Это на пути Вима ctags. Я могу проверить это, набрав ^] на символе, и затем я перейду к определению символов.

  5. Обновление 1: Весь код моего проекта находится на пути к Python-in-Vim. Я могу :python import myproject успешно.

Теперь везде, где я пытаюсь C-x C-o , все, что я получаю, это:

-- Omni completion (^O^N^P) Pattern not found

Что я делаю не так?

Обновление 2: Когда я набираю C-x C-o C-n на уровне модуля, Vim отображает всплывающее окно завершения с несколькими константами уровня модуля из других модулей в моем проекте. Но это только константы (символы заглавные буквы), и завершение по-прежнему не работает нигде.

Обновление 3: Я обнаружил, что Cx Co в верхней части файла запускает какое-то повторение, а завершение для pprint. вызывает меню и быстро ссылка на все в модуле pprint. Однако ни один из импортов моего собственного модуля не завершается.

Обновление 4, год спустя: Я сдался и изучил Emacs. Я был на темной стороне, в мистической стране интриг и пряностей, и я говорю тебе, что нашел Путь.

Обновление 5, два года спустя: Я вернулся в Vim. Emacs прекрасен, но даже после 1,5 лет Emacs я все еще быстрее справляюсь с работой в Vim. Однако сейчас я перестал писать Python и не могу проверить, насколько хорошо работают эти предложения.

Ответы [ 9 ]

12 голосов
/ 18 января 2010

Какой модуль содержит символ, который вы пытаетесь завершить? Это в питоне stdlib? Или это сторонний модуль?

Убедитесь, что модуль / пакет находится в PYTHONPATH.

В Vim выполните:

:python import sys
:python print sys.path

Чтобы добавить каталог модуля:

:python sys.path.append("/path/to/directory/")
9 голосов
/ 01 августа 2011

Звучит так, будто спрашивающий уже давно ушел на темную сторону *, но что бы это ни стоило, у меня только что был этот симптом, и в моем случае причина была в том, что модуль, который я использовал, полагался на Python 2.7, но моя версия Vim был скомпилирован с Python 2.5.

Для диагностики я попытался :python import mymodule, которая завершилась ошибкой при импорте зависимого модуля. Затем :python import dependentmodule, который потерпел неудачу со следующим шагом в цепочке. И так далее, пока не удалось импортировать системный модуль, который был новым с Python 2.7. Проблема найдена.

Чтобы решить, я просто сделал sudo port install vim +python27. Но это для OSX. YMMV.

(* Я шучу. Пользователи Emacs - наши друзья. Люди, которые программируют в Notepad, мы все должны сохранить ...)

9 голосов
/ 11 февраля 2010

Поскольку вы были осторожны и убедились, что ваш код доступен PYTHONPATH, согласно предложению codeape, существует ли вероятность того, что вы столкнетесь с ошибкой import для Vim Python omni-complete ? Эта ошибка по-прежнему существует на Vim 7.2.245.

По сути, если какой-либо оператор импорта завершится неудачно в файле, с которым вы работаете, независимо от того, заключен ли он в предложение Try-Except, он полностью прервет омни-завершение. Это должно быть довольно легко проверить, так как большая часть импорта происходит в самом начале файла.

Если вы решите, что эта ошибка является причиной ваших проблем, ваши варианты включают:

  • убедившись, что импортируемые вами модули находятся в системном пути, а не только в файлах проекта
  • комментирует любые import операторы, которые терпят неудачу
  • исправление ошибки
  • с использованием ropevim в качестве метода завершения
  • с использованием другого редактора; В среде IDE Netbeans есть поддержка Python, а плагин jVi довольно хорош, если вы такой же наркоман Vim, как и я (не позволяйте 1990-м годам заглядывать на домашнюю страницу, чтобы вас обмануть)
2 голосов
/ 01 сентября 2012

У меня была похожая проблема с неработающим завершением omni. В моем случае оказалось, что плагин minibufexpl.vim мешает завершению омни. Вот как я узнал:

Обычное завершение ключевых слов работает. Omni complete не работает ни на одном языке, не только на Python. omnifunc установлен правильно. После того, как я C-X C-O, ничего не происходит. Я делаю ": py print globals ()" и ясно, что pythoncomplete не был загружен. Я могу ": вызвать pythoncomplete # Complete (1, '')" и посмотреть, как он загружается. Для меня это исключает проблему Vim. Кажется, что-то мешает сопоставлению клавиш или иным образом перехватывает запрос завершения omni. Поэтому я начинаю отключать мои плагины один за другим. Оказывается, виновником в моем случае является «minibufexpl». У меня есть версия Holgado от GitHub.

Похоже, что есть много открытых проблем с MBE в соответствии с трекером проблем на github, и с начала 2012 года не было никакого прогресса. Я просто собираюсь отключить его сейчас, чтобы я мог использовать автозаполнение. Тем временем я просто добавлю следующее в свой vimrc, чтобы сохранить открытыми несколько модифицированных буферов одновременно, и использую простую последовательность клавиш для их циклического переключения (MBE более разумно выбирает буферы для циклического перехода, но кажется слишком сложным для простой проблемы). ):

set hidden
noremap <C-TAB> :bnext<CR>
noremap <C-S-TAB> :bprev<CR>
2 голосов
/ 15 марта 2012

Обновившись до Fedora 16 (но все еще компилируя vim из исходного кода), omni complete перестало работать с тем же сообщением, что и выше.Я «исправил» это путем повторного сопоставления ключей.

inoremap <C-space> <C-x><C-o>

в ~/.vimrc и теперь он снова работает.

0 голосов
/ 30 марта 2017

Если вы используете python2, убедитесь, что вы

sudo apt-get install vim.nox-py2 

и используйте vim.nox-py2 вместо vim.

0 голосов
/ 04 марта 2011

Я использовал супертаб (http://www.vim.org/scripts/script.php?script_id=1643)

Поскольку C-x C-o немного разочаровывает использование

в .vimrc:

let g:SuperTabDefaultCompletionType = "<c-x><c-o>"

тогда просто используйте Tabb для омполнения

0 голосов
/ 24 июня 2010

c-x c-n работает для получения списка членов объекта.

0 голосов
/ 11 февраля 2010

Вы пробовали использовать <C_x><C-]>?

...