如何在vim中为不同类型的自动完成设置不同的自动完成行为?

时间:2013-01-03 11:27:32

标签: vim autocomplete omnicomplete

vim的默认行为是记下它找到的第一个匹配项,并显示一个包含所有其他匹配项的下拉菜单。当我使用它来自动完成代码内容(比如来自库的函数名称)时,使用它通常很难,因为它选择了最长的单词并删除了一个很长的列表,需要花费太多精力来删除一半的单词或手动搜索类似单词的菜单。

示例:我使用OpenCV,当我写cvCr(<Ctrl-x><Ctrl-o>)时,它会写cvCreate2DHMM并显示一个包含大约20-30个内容的菜单,所有内容都以cvCreate开头。然后我必须删除一半的单词或在菜单中手动搜索。

有一种简单的方法可以改变这种行为,只记下大多数IDE所做的最长的常见匹配(在手册中,我知道如何找到它)。

但是,当我使用<Ctrl-x>s修复拼写错误时,我更喜欢默认行为。

有没有办法为不同的自动完成分别设置行为?

1 个答案:

答案 0 :(得分:1)

您的意思是您想要从longest选项切换'completeopt'

您必须覆盖完成触发器,并在前面添加一个无操作:map-expr来更改选项,如下所示:

function! CompleteoptLongest( isEnable )
    set completeopt-=longest
    if a:isEnable
        set completeopt+=longest
    endif
    return ''
endfunction
:inoremap <expr> <SID>CompleteoptLongestOn CompleteoptLongest(1)
:inoremap <expr> <SID>CompleteoptLongestOff CompleteoptLongest(0)

:inoremap <script> <C-n> <SID>CompleteoptLongestOn<C-n>
" Repeat for all other completion commands you use...

:inoremap <script> <C-x><C-s> <SID>CompleteoptLongestOff<C-x><C-s>
相关问题