Ctrl + Space用于在vim中进行omni和关键字完成

时间:2009-02-04 08:25:00

标签: vim code-completion

我想在vim中使用 Ctrl + Space 进行omni-completion(如果没有omni-completion,则使用关键字完成)。我试过这个,我在网上找到了一个地方:

inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""
然而,它不起作用。任何使用 Ctrl + Space 的人都可以向我展示正确的方法(可行)吗?

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:16)

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

简答 - 使用此:

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有两个可能的值(取决于终端/ gvim用法):<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时,它以某种方式执行<C-n><C-p><C-n>,可以将IMHO缩写为<C-n>
  • 如果完成不成功,它会使用退格键并再次完成,而不是<C-o><C-x>而是<C-n>,这听起来没什么意义。

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

答案 2 :(得分: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>