我的 .vimrc
中有这些插入模式映射文件:
imap <C-e> <C-o>A
imap <C-a> <C-o>I
它们使 Ctrl-A 和 Ctrl-E 将光标移动到行的开头和结尾,而无需离开插入模式,就像 emacs 键绑定(bind)一样。但是,我刚刚意识到 Ctrl-E 映射引入了与自动完成子模式的冲突。
:help complete_CTRL-E
中的文档状态:When completion is active, you can use CTRL-E to stop it and go back to the originally typed text.
因此,我的 Ctrl-E 映射会干扰这一点。有没有一种方法可以让 Ctrl-E 仅在自动完成未激活时跳转到行尾?
最佳答案
没有适当的方法来测试是否
Ctrl+X-完成模式是否处于事件状态。
但是,以下两种解决方法是可能的。
1. 如果使用弹出菜单从可用列表中进行选择
补全(尤其是在 menuone
中设置的 completeopt
选项),可接受的解决方案可能是映射
inoremap <expr> <c-e> pumvisible() ? "\<c-e>" : "\<c-o>A"
2. 一般的解决方案可以基于副作用:在完成子模式,不允许递归进入插入模式
(见
: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
关于vim - 如何为插入模式创建映射,而不是为 Vim 中的自动完成子模式创建映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926034/