Подтвердить что ты не робот

Vim Omnicompletion с Python просто не работает

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

  • У меня есть Vim 7.2, скомпилированный с поддержкой Python.

  • filetype plugin on находится в моем .vimrc.

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

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

  • Обновление 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:. Я обнаружил, что C-x C-o в верхней части файла запускает какой-то omnicompletion, а завершение для pprint. вызывает меню и быстро ссылается на все в модуль pprint. Однако ни один из моих собственных импортных модулей не завершается.

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

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

4b9b3361

Ответ 1

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

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

В Vim, do:

:python import sys
:python print sys.path

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

:python sys.path.append("/path/to/directory/")

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

После обновления до Fedora 16 (но все еще скомпилировав vim из источника), omni завершение перестало работать с тем же сообщением, что и выше. Я "исправил" его, перерисовывая ключи.

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

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

Ответ 5

У меня была аналогичная проблема с тем, что 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>

Ответ 6

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

Ответ 7

Вы не делаете ничего плохого. Дополнение Python omni не использует теги файл. Это специально. Вам не нужно делать файл тегов для омни завершение. Вы все еще можете сделать файл тегов для обычного прыжка в стек тегов, но это игнорируется омни завершением.

Мне потребовалось много времени, чтобы понять это, потому что завершение C omni действительно использует файл тегов. Завершение Python Omni работает по-другому.

Вы можете быстро наблюдать это поведение, пытаясь выполнить омни завершение в файле Python с типом файла python, а затем с типом файла c.

Сначала :set filetype=python (это значение по умолчанию), затем :echo &omnifunc. Omni complete игнорирует файл тегов, поскольку &omnifunc - это python3complete#Complete, который не использует файл тегов.

Теперь :set filetype=c и :echo &omnifunc. Vim рассматривает скрипт Python как файл C, поэтому &omnifunc - это ccomplete#Complete, который использует файл тегов. Конечно, обработка файлов Python, таких как файлы C, не является решением!

Ниже приведены:

  • два примера того, как сделать Python omni дополнением
  • где реализованы сценарии Vim &omnifunc (синтаксис завершен # завершен)
  • как поведение окна preview отличается между предварительным просмотром файла тегов (:pta) и полный предварительный просмотр.

Также есть завершение тега: <C-x><C-]>. Если вы уже используете файл tags и хотите, чтобы Vim завершил работу с этими тегами, <C-x><C-]> - это то, что вы ищете, а не <C-x><C-o>.

Но я призываю вас читать дальше. Завершение Omni делает больше, чем завершение тега:

  1. Завершение Omni распознает имена модулей и автоматически завершает работу с использованием правильного синтаксиса Python. Например, если вы import numpy as np, то np.a<C-x><C-o> представляет меню функций numpy, начинающихся с буквы "a". Завершение тегов только автоматически завершает совпадение в файле тегов.
  2. Завершение Omni заполняет окно предварительного просмотра документацией. Завершение тега не открывает окно предварительного просмотра.
  3. А для Python полное завершение не требует обновления файла тегов!

Пример 1: полное завершение, чтобы соответствовать шаблону в этом файле

Для полного завершения Python требуется, чтобы редактируемый вами скрипт Python был рабочий код Python. Вот простой пример с локальной переменной:

foo_name_I_expect_omni_completion

Этот однострочный скрипт не запускается (имя моей переменной не определено), поэтому если я отредактируйте этот сценарий и попробуйте завершить:

foo_name_I_expect_omni_completion
foo_name_<C-x><C-o>

Я получаю сообщение "Шаблон не найден".

Это приводит в бешенство, потому что образец, которому это должно соответствовать, буквально на строка выше!

Но все, что нам нужно, чтобы завершить работу, - изменить это на действительный. Код Python:

foo_name_I_expect_omni_completion = 2
foo_name_<C-x><C-o>

Теперь все работы завершены!

Пример 2: полное завершение для сопоставления с шаблоном в импортированном модуле

В качестве второго примера, омни завершение также работает, если шаблон для сопоставления находится в другой файл, если этот файл видим (с оператором import) для скрипт редактируется.

Я снова буду использовать foo_name_I_expect_omni_completion=2. Я сохраняю файл с этим однострочник как mymodule.py. Теперь в новом файле, example.py, я импортирую mymodule:

import mymodule

Как только я напечатал import mymodule, i_<C-x><C-o> работает над имя модуля:

import mymodule
mym<C-x><C-o>

Omni complete превращает это в:

import mymodule
mymodule.

и всплывает меню шаблонов (см. :h completeopt для настройки меню поведение), после чего я могу сделать обычный <C-n><C-y>, чтобы выбрать первый выберите пункт в списке и выйдите из режима omni complete для возврата в режим вставки.

import mymodule
mymodule.foo_name_I_expect_omni_completion

Если omni complete не работает, убедитесь, что импортируемый модуль является исполняемым

Если полное завершение не может увидеть импортированный модуль, это потому, что импортируемый модуль не является исполняемым.

В отличие от приведенного выше примера с игрушкой, это трудно отследить, если импортированный модуль также импортирует пакеты, и у вас есть несколько версий Python с разными пакеты установлены в каждой версии.

Например, у меня установлены 3.6 и 3.7, но я установил только пакет на 3.6. И тот же пакет был импортирован модулем, который я импортировал в сценарии, который я пытался редактировать с помощью omni complete.

Каким-то образом python3.6 был моим Python3 по умолчанию из Bash, но Python3.7 был моим по умолчанию от Vim. Таким образом, модуль казался действительным, когда я запускал его из Bash, потому что В моей установке python3.6 был необходимый пакет.

Проверьте, какая версия Python Vim использует:

python3 print(sys.version)

Документация

Я понял это, отследив сценарии Vim, которые выполняют завершение.

Из справки Vim:

:h compl-omni-filetypes

Файл, используемый для {filetype}, должен быть автозагрузкой /{filetype} complete.vim в "runtimepath". Таким образом, для "Java" это автозагрузка /javacomplete.vim.

Эти файлы autoload/{filetype}complete.vim находятся в вашей установке Vim. Например, вот мои файлы C и Python:

/usr/share/vim/vim81/autoload/ccomplete.vim
/usr/share/vim/vim81/autoload/python3complete.vim

В качестве альтернативы, позвоните :echo &omnifunc и найдите Vimscript на GitHub: https://github.com/vim/vim/blob/master/runtime/autoload/

Я начал подозревать, что мое фундаментальное неправильное понимание проблемы, когда я обнаружил, что слово tag не появляется в файле python3complete.vim :)

Omni complete имеет специальное поведение preview

Меня всегда смущало поведение окна предварительного просмотра. Omni complete отличается от тегов поведением preview.

Во-первых, чтобы получить окно предварительного просмотра с omni complete, опция Vim completeopt должна содержать preview и либо menu, либо menuone.

completeopt по умолчанию - menu,preview. Чтобы установить параметры явно, например, вместо этого использовать menuone на menu:

set completeopt=menuone,preview

menuone заставляет меню всегда появляться, даже если есть только один шаблон, который соответствует. С menu, меню не отображается для одного совпадения, так же как и окно preview. Использование menuone гарантирует, что появится окно preview.

Отключите preview, чтобы предотвратить разделение окна во время полного завершения:

set completeopt-=preview

Обратите внимание, что поведение preview для omni complete (которое открывается при выделении элемента меню) отличается от поведения preview для тегов (которое вы открываете с помощью <C-w>} или :pta)

  • tag-preview открывает код в окне предварительного просмотра
  • omni-complete-preview открывает документацию

Omni complete preview показывает разные вещи в зависимости от предмета выделено в меню завершения. Если это переменная, то pydoc для ее тип данных показан; если это функция, отображается строка документации.

Ответ 8

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

Ответ 9

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

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

в .vimrc:

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

то просто используйте Tabb для omnicompletion

Ответ 10

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

sudo apt-get install vim.nox-py2 

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