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

3
vim的默认行为是写下它找到的第一个匹配项,并显示一个下拉菜单,列出所有其他匹配项。当我使用它来自动完成代码(例如库中的函数名)时,它经常很笨拙,因为它选择最长的单词并放下一个长列表,需要花费太多精力才能删除一半的单词或手动搜索类似单词的菜单。
例如:我使用OpenCV,当我输入cvCr(<Ctrl-x><Ctrl-o>)时,它会写下cvCreate2DHMM,并显示一个菜单,其中大约有20-30个以cvCreate开头的项目。然后我要么删掉一半的单词,要么手动在菜单中搜索。
有一种简单的方法可以将该行为更改为仅写下最长公共匹配项,就像大多数IDE所做的那样(在手册中可以找到并且我知道如何找到它)。
但是,当我使用<Ctrl-x>s来纠正拼写错误时,我更喜欢默认行为。
有没有一种方法可以针对不同的自动完成设置不同的行为呢?
1个回答

1

你的意思是想从'completeopt'选项中切换到longest吗?!

你需要覆盖完成触发器,并在更改选项之前添加一个无操作的: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>

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