vim - 如何为插入模式创建映射,而不是为 Vim 中的自动完成子模式创建映射?

标签 vim

我的 .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/

相关文章:

Vim:在fortran中跳转到if endif

vim - 如何在 Visual Studio Code vim 扩展中使用 vim(键绑定(bind))

regex - 替代字符串中组上的vim调用函数

vim - 如何将以空格作为唯一分隔符的段落表格化

vim - 如何让 Ctrl+= 在 Vim 中表现得像 Ctrl+w =?

c++ - vim c++ 断行

vim - 为什么 VIM 中的某些配色方案不起作用?

vim - 将未保存的 Vim 缓冲区写入文件而不保存

vim - 让 vim tag-matchlist 打开一个新选项卡

vim - 如何在vim中从某些列/字符开始排序