为插入模式创建映射,但不为自动完成子模式创建映射

时间:2011-08-03 11:54:47

标签: vim

我的vimrc中有这些插入模式映射:

imap <C-e> <C-o>A
imap <C-a> <C-o>I

他们让ctrl-actrl-e将光标移动到行的开头和结尾,而不离开插入模式, a la emacs键绑定。

我刚刚意识到<C-e>映射引入了与自动完成子模式的冲突。 CTRL-E州的文档:

When completion is active you can use CTRL-E to stop it and go back to the
originally typed text.

我的<C-e>映射会干扰此问题。有没有一种方法可以让ctrl-e只有在自动完成不活动时跳转到行尾?

1 个答案:

答案 0 :(得分:15)

没有设计方法来测试是否 Ctrl + X - 完成模式是否有效。如果一个 使用弹出菜单从可用的完成列表中进行选择 可接受的解决方案可能是映射

inoremap <c-e> <c-r>=pumvisible() ? "\<c-e>" : "\<c-o>A"<cr>

(特别是在menuone选项中设置completeopt的情况下。)

一般解决方案可以基于副作用:在完成中 子模式,不允许递归进入插入模式(参见 :helpgrep Note: While completion)。

inoremap <c-e> <c-r>=InsCtrlE()<cr>
function! InsCtrlE()
    try
        norm! i
        return "\<c-o>A"
    catch
        return "\<c-e>"
    endtry
endfunction