Почему SuperTab выдает себя, когда я нажимаю <tab>? - PullRequest
11 голосов
/ 08 февраля 2012

Настройка

В моем .vimrc есть следующие строки:

" .vimrc
let g:virtualenv_directory="/Users/Kit/Development/virtualenv"

Тогда в ~/.vim/ftplugin/python/virtualenv.vim У меня есть эти:

py << EOF
import os.path
import sys
import vim
if 'VIRTUAL_ENV' in os.environ:
    project_base_dir = os.environ['VIRTUAL_ENV']
    sys.path.insert(0, project_base_dir)
    activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
    execfile(activate_this, dict(__file__=activate_this))
    print "virtualenv in os.environ!"
EOF
VirtualEnvActivate my-virtualenv-python-2.7

В ~/.vim/ftplugin/python/virtualenv.vim У меня есть следующие настройки SuperTab:

setlocal omnifunc=pythoncomplete#Complete
setlocal completeopt=menuone,longest,preview
let g:SuperTabDefaultCompletionType="<c-x><c-]>"

В моем рабочем каталоге, из которого я всегда работаю, я выполнил следующую команду bash, чтобы сгенерировать файл TAGS для всех моих файлов .py

find . -name '*.py' -type f -print0 | xargs -0 etags -l python

проблема

Например, у меня есть main.py, в котором есть объект app, так что следующий скрипт работает нормально:

import main
new_app = main.app() # works totally fine Python-wise

Если, например, я напишу новый код и попытаюсь использовать SuperTab omnicompletion:

import main
new_new_app = main.<Tab>

Вот что я получаю:

new_new_app = mainself.

А если я нажму Tab несколько раз:

new_new_app = mainselfselfselfself.

Что у меня работает

Если, однако, я делаю следующее:

new_new_app = main.a<Tab>

Я получаю полный список a.. объектов, которые включают в себя те, которые не принадлежат модулю main.

Что я хочу

Если я установлю следующее в .vimrc:

let g:SuperTabDefaultCompletionType="context"

Затем я использую модуль из стандартной библиотеки Python:

import sys
sys.<Tab> # This will still result in sysselfselfself.
sys.p<Tab> # This will result in the correct list of `sys` members beginning with `p`

Но настройка "context" не будет работать на моих собственных модулях:

new_new_app = main.a<Tab>
# Will say at the bottom: Omni completion (^O^N^P) Pattern not found

Вопрос

Как мне настроить omnicompletion и SuperTab, чтобы они работали как для моих собственных модулей, так и для модулей стандартной библиотеки? А также устранить selfselfself. раздражение?

1 Ответ

5 голосов
/ 08 апреля 2012

Как вы указали, это вызвано snipmate: https://github.com/garbas/vim-snipmate/issues/65

Я также предложил решение: https://github.com/garbas/vim-snipmate/pull/84

Оно не было принято, потому что snipmate не должно быть контекстомчувствительный.

Для этого есть два решения:

  1. Возьмите мой ответный код:

    https://github.com/davidhalter/vim-snipmate

    Что, вероятно,не лучшая идея, так как это всего лишь моя вилка, и я не активно ее поддерживаю.

  2. Вилка https://github.com/honza/snipmate-snippets и удалите отображение для точки (Использование точки приведет кбольше не возможно, чтобы завершить себя).

...