27

我想在 vim 中使用Ctrl+Space进行全补(如果没有全补,则使用关键字补全)。我试过这个我在网上某处找到的:

inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""

但是它不起作用。任何为此使用Ctrl+Space的人都可以向我展示正确的方法(有效的方法)吗?

值得注意的是,它需要在终端版本的 vim 而不是 gvim 中工作。

4

3 回答 3

43

试试这个:

inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\\<lt>c-n>\\<lt>c-p>\\<lt>c-n>\" :" .
\ "\" \\<lt>bs>\\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>
于 2009-02-04T08:54:04.387 回答
18

上述方式是“某种”工作,但它是如此难以理解,几乎没有人能说出它实际上做了什么。上面的解决方案不好。

简短的回答 - 使用这个:

function! Auto_complete_string()
    if pumvisible()
        return "\<C-n>"
    else
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end
endfunction

function! Auto_complete_opened()
    if pumvisible()
        return "\<Down>"
    end
    return ""
endfunction

inoremap <expr> <Nul> Auto_complete_string()
inoremap <expr> <C-Space> Auto_complete_string()

这个答案还尊重 Ctrl+Space:<C-Space><Nul>.

我使用与jedi-vim中的第一种方法类似的方法,但更可定制。


长答案 - 以上内容:

上述答案的整个转义是如此令人困惑,以至于我将上述答案拆分为可读格式:

function! Auto_complete_string()                               
    if pumvisible()                                            
        return "\<C-n>"                                        
    else                                                       
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end                                                        
endfunction                                                    

function! Auto_complete_opened()                               
    if pumvisible()                                            
        return "\<c-n>\<c-p>\<c-n>"                            
    else                                                       
        return "\<bs>\<C-n>"                                   
    end                                                        
endfunction                                                    

inoremap <expr> <Nul> Auto_complete_string()

这清楚地表明了它在做什么。中发生了一些奇怪的事情Auto_complete_opened。它不仅仅是完成,它在尝试完成后还做了两件事:

  • 当尝试使用omnicompletion时,它会以某种方式执行a <C-n><C-p><C-n>,恕我直言,它可以缩写为<C-n>
  • 如果完成不成功,它会使用退格并再次完成,而不是<C-o><C-x>but <C-n>,这没有多大意义。

我并不是说这不是某些用户可能想要的,但它可能不是大多数用户想要的!我的简短回答对此表示赞赏,并为您提供了一种简单的编辑方法。您现在可以根据需要轻松更改内容(例如<Down><C-n>如果您希望从头开始写入第一个条目)。

于 2013-08-28T11:01:32.930 回答
0

对于 iterm2 和 vim,这些行对我有用,我来自 jedi-vim

" Next three lines are to enable C-Space to autocomplete, omnicomplete
inoremap <C-Space> <C-x><C-o>
imap <buffer> <Nul> <C-Space>
smap <buffer> <Nul> <C-Space>
于 2015-08-09T21:58:16.127 回答