2013-03-26 85 views
1

我有一个疯狂的小挑战。我想重新映射制表符并将+ tab移到vim中的基本制表符完成。下面是我起步的地方:在vim中重新映射制表符完成

set completeopt= 
inoremap <tab> <C-n> 
inoremap <S-tab> <C-p> 

这没有任何影响的,同时我也意识到这可能会搞乱了我的片段插件。我去google搜索,发现这个:http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion,但没有实施任何建议的运气。

我想映射到选项卡并移动+选项卡,而不会丢失片段功能。任何帮助将摇滚!

更新:我也尝试过,现在运气好。它没有可感知的效果。

fu! InsertTabWrapper(direction) 
    let char_before = col('.') - 1 
    if !char_before || getline('.')[char_before - 1] !~ '\k' 
    return "\<tab>" 
    elseif "backward" == a:direction 
    return "\<c-p>" 
    else 
    return "\<c-n>" 
    endif 
endfu 
inoremap <tab> <c-r>=InsertTabWrapper("forward")<cr> 
inoremap <s-tab> <c-r>=InsertTabWrapper("backward")<cr> 
+0

说在一个php/java/c文件中,你有“虽然它被称为”在评论中,然后你键入'wh ',你想要什么? 'while'?或'while循环片段'? – Kent 2013-03-26 17:17:17

+0

while循环片段。这对我来说不是很常见,但我希望片段优先。 – Costa 2013-03-26 17:29:32

回答

1

我同意你说的映射<tab>是Vim头疼的事情。

我个人有SUPERTABNeocompletecacheSnipmatepydiction ....真的花了一些时间,让他们一起工作,与<tab> ......即使没有(也许)完美的,这足够我的日常使用。

回到你的问题,你可以考虑安装一个插件叫做superTabhttps://github.com/ervandew/supertab),并且在.vimrc加上这些行:

let g:SuperTabDefaultCompletionType = 'context' 
let g:SuperTabContextTextOmniPrecedence = ['&omnifunc','&completefunc'] 
let g:SuperTabRetainCompletionType=2 

inoremap <expr><Enter> pumvisible() ? "\<C-Y>" : "\<Enter>" 
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>" 

然后....好运气......我希望它的工作原理为您的要求。

+0

谢谢,肯特!我看了SuperTab。这对我来说是一大堆开销,我没有用它做的一切。不过谢谢! – Costa 2013-03-26 17:58:10

+1

@Costa我建议先安装它,并将这些行复制到vimrc中,然后进行测试,最好对多个文件类型进行测试。如果它按照预期工作。浏览帮助文件,看看它为什么起作用,它可以做什么......说实话,我刚刚评论了我的neocomp和pydict插件,并对supertab设置做了一些小改动。它似乎**工作,我只是在vim ft和java ft中测试过,我觉得你的问题可以在不安装superTab的情况下解决。但我没有试一试。祝你好运! – Kent 2013-03-26 18:04:02

+0

谢谢,肯特,我来看看。 – Costa 2013-03-26 18:16:44