【问题标题】:Ctrl+Space for omni and keyword completion in vimCtrl+Space 用于 vim 中的全向和关键字补全
【发布时间】:2010-10-05 08:39:33
【问题描述】:

我想在 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中工作。

【问题讨论】:

    标签: vim code-completion


    【解决方案1】:

    试试这个:

    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>
    

    【讨论】:

    • 这正是我想要的。谢谢。
    • 我在 OS X Leopard 中试过这个,当我尝试 ctrl-space 时,它​​会打印两个空格 - 并且不起作用:(
    【解决方案2】:

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

    简答 - 使用这个:

    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 的使用):&lt;C-Space&gt;&lt;Nul&gt;

    我使用与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 时,它会以某种方式执行&lt;C-n&gt;&lt;C-p&gt;&lt;C-n&gt;,恕我直言,这可能只是缩写为&lt;C-n&gt;
    • 如果补全不成功,它会使用退格并再次补全,不是&lt;C-o&gt;&lt;C-x&gt;,而是&lt;C-n&gt;,这没有多大意义。

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

    【讨论】:

    • 感谢您解释那些脱口而出的代码。它让我对我运行的代码有了更多的理解和更多的信任。但要确保我没有遗漏任何东西: - 不是C-x/C-o alrdy 把你放在第一个自动完成的单词上吗?这可能会使&lt;down&gt;&lt;C-n&gt;/&lt;C-p&gt;/&lt;C-n&gt; 的需要无效-原始问题询问如何在omni 找不到任何解释&lt;bs&gt;/&lt;C-n&gt; 的匹配项的情况下自动在omni 完成和单词完成之间切换(我不明白他为什么要添加&lt;bs&gt; 当他可以做另一个 &lt;C-x&gt; 而不是删除一个词时)
    【解决方案3】:

    对于 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2010-11-16
      相关资源
      最近更新 更多