我想用 控制键+空间 用于 vim 中的全能补全(如果没有全能补全则为关键字补全)。我已经尝试过这个,我在网上找到了这个:

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

但是它不起作用。任何正在使用的人 控制键+空间 为此,谁可以告诉我正确的方法(有效)来做到这一点?

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

有帮助吗?

解决方案

尝试这种情况:

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>

其他提示

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

简短的回答 - 使用这个:

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>.

我使用与第一个类似的方法 绝地维姆, ,但更可定制。


长答案 - 上面的作用是什么:

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

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. 。它不只是完成完成,它在尝试完成后还做了两件事:

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

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

有关iterm2和VIM这些线路对我的作品,我从绝地-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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top