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

Не используйте ImageViewer, используйте Label или ScaleImageLabel. ImageViewer захватывает события указателя для панорамирования изображения и позволяет увеличить его. Он предназначен для использования в течение всего Form и не будет хорошо работать в сценарии прокрутки.

Если вы хотите эту функциональность, я предлагаю поместить небольшую миниатюру в Button, а затем, когда она нажата, показать ImageViewer в отдельном Form в центре BorderLayout.

52
задан a paid nerd 16 August 2013 в 12:05
поделиться

5 ответов

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

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

можно быстро наблюдать это поведение путем попытки omni завершения в файле Python с [1 112] тип файла и затем с [1 113] тип файла.

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

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

Ниже:

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

существует также завершение тега: <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, omni завершение не требует обновления файла тегов!

Пример 1: omni, завершенный для соответствия шаблону в этом файле

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

foo_name_I_expect_omni_completion

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

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

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

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

, Но все мы должны заставить omni завершение работать, изменение это к [11 127] допустимый код Python:

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

Теперь omni работы завершения!

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

, Поскольку, второй пример, omni завершение также работает, если шаблон для соответствия находится в другом файле, пока тот файл видим (с import оператор) к отредактированному сценарию.

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

import mymodule

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

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

Omni завершают повороты это в:

import mymodule
mymodule.

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

import mymodule
mymodule.foo_name_I_expect_omni_completion

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

, Если omni завершение кажется неспособным для наблюдения импортированного модуля, это - потому что модуль, который Вы импортируете, не является исполняемым файлом.

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

, Например, я имею 3.6 и 3,7 установленных, но я только установил определенный пакет на 3,6. И тот же самый пакет был импортирован модулем, который я импортировал в сценарии, который я пытался отредактировать с завершенным omni.

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

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

python3 print(sys.version)

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

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

От справки Vim:

:h compl-omni-filetypes

файл, используемый для {типа файла}, должен быть автозагрузкой / {тип файла} complete.vim в 'runtimepath'. Таким образом для "Java" это - autoload/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 /

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

завершенный Omni имеет специальное предложение preview поведение

, я всегда смущался поведением окна предварительного просмотра. Omni, завершенный , имеет другое preview поведение от тегов.

Первый, для получения окна предварительного просмотра с [1 147] опция Vim completeopt должна содержать preview и или menu или menuone.

completeopt значения по умолчанию к [1 153]. Установить опции явно, например, использовать menuone вместо этого на [1 155]:

set completeopt=menuone,preview

menuone заставляет меню всегда появиться, даже если существует только один шаблон, который соответствует. С [1 157], меню не появляется для единственного соответствия, таким образом, ни один не делает preview окно. Используя [1 159] гарантии preview открывается окно.

Выключают preview для предотвращения разделения окна во время завершенного omni:

set completeopt-=preview

Уведомление, что preview поведение для [1 163] (который открывается при выделении пункта меню) отличается от preview поведение для тегов (который Вы открываете с [1 165] или :pta)

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

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

1
ответ дан 7 November 2019 в 09:37
поделиться

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

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

В VIM делайте:

:python import sys
:python print sys.path

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

:python sys.path.append("/path/to/directory/")
12
ответ дан 7 November 2019 в 09:37
поделиться

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

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

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

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

Пытались ли вы использовать < C _ x > < C-] > ?

1
ответ дан 7 November 2019 в 09:37
поделиться

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

0
ответ дан 7 November 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: