为什么当我按下 <tab> 键时,SuperTab 会输出 self?

11

配置

在我的.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命令来为所有的.py文件生成一个TAGS文件。
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>

我得到了一个完整的列表,其中包括那些不属于主模块maina..对象。

我的期望

如果我在.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.的烦恼?


我可能错了,但我认为SuperTab做的与其他类似的插件一样:它们尝试猜测上下文并调用正确的内置omni-completion以提供最准确的结果。你有没有尝试过不使用SuperTab的omni-completion? <C-x> <C-o>, <C-x> <C-]>, <C-x> <C-u> 结果如何?另外,你使用的是哪个Python完成脚本? - romainl
@romainl,是的,你提到的关键序列都没问题。我认为这是由于 SnipMate 的一个 bug 引起的。https://github.com/garbas/vim-snipmate/issues/65 - Kit
尝试恢复到原始的SnipMate。 - romainl
1个回答

5
正如你所指出的那样,这是由snipmate引起的:https://github.com/garbas/vim-snipmate/issues/65 我也提出了一个解决方案:https://github.com/garbas/vim-snipmate/pull/84 它没有被接受,因为snipmate不应该是上下文敏感的。
有两个解决方案:
  1. 使用我的snipmate分支: https://github.com/davidhalter/vim-snipmate 这可能不是最好的主意,因为它只是我的分支,我不会积极维护它。
  2. 分支https://github.com/honza/snipmate-snippets并删除点的映射(将无法再使用点来完成自身)。

谢谢你的回答!我刚刚克隆了你的分支,也发现你和其他人在 Snipmate 的新分支上所做的所有很棒的工作!太好了。 - Bodhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接