当我按<tab>时,为什么SuperTab输出自我?

Kit*_*Kit 11 tags vim autocomplete code-completion supertab

安装程序

在我的.vimrc我有以下几行:

" .vimrc
let g:virtualenv_directory="/Users/Kit/Development/virtualenv"
Run Code Online (Sandbox Code Playgroud)

然后在~/.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
Run Code Online (Sandbox Code Playgroud)

~/.vim/ftplugin/python/virtualenv.vim我有这些SuperTab设置:

setlocal omnifunc=pythoncomplete#Complete
setlocal completeopt=menuone,longest,preview
let g:SuperTabDefaultCompletionType="<c-x><c-]>"
Run Code Online (Sandbox Code Playgroud)

在我的工作目录中,我一直在工作,我执行了以下bash命令TAGS为我的所有.py文件生成一个文件

find . -name '*.py' -type f -print0 | xargs -0 etags -l python
Run Code Online (Sandbox Code Playgroud)

问题

例如,我有一个在main.py其中有一个对象app,以便以下脚本正常工作:

import main
new_app = main.app() # works totally fine Python-wise
Run Code Online (Sandbox Code Playgroud)

例如,如果我编写一些新代码并尝试使用SuperTab omnicompletion:

import main
new_new_app = main.<Tab>
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

new_new_app = mainself.
Run Code Online (Sandbox Code Playgroud)

如果我按Tab几次:

new_new_app = mainselfselfselfself.
Run Code Online (Sandbox Code Playgroud)

什么对我有用

但是,如果我执行以下操作:

new_new_app = main.a<Tab>
Run Code Online (Sandbox Code Playgroud)

我得到一个a..包含那些不属于模块的对象的完整列表main.

我想要的是

如果我在以下位置设置.vimrc:

let g:SuperTabDefaultCompletionType="context"
Run Code Online (Sandbox Code Playgroud)

然后,我使用标准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`
Run Code Online (Sandbox Code Playgroud)

但该"context"设置不适用于我自己的模块:

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

问题

我应该如何设置omnicompletion和SuperTab,以便它对于我自己的模块和标准库模块一样?除了消除selfselfself.烦恼?

Dav*_*ter 5

如您所指出的,这是由snipmate引起的:https : //github.com/garbas/vim-snipmate/issues/65

我还提出了一个解决方案:https : //github.com/garbas/vim-snipmate/pull/84

它未被接受,因为片段不应该是上下文敏感的。

有两种解决方案:

  1. 拿我的狙击叉:

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

    这可能不是最好的主意,因为这只是我的叉子,我没有积极维护它。

  2. 派发https://github.com/honza/snipmate-snippets并删除该点的映射(不再可能使用该点来完成自我)。