【问题标题】:How to create a mapping for Insert mode but not for the autocomplete submode in Vim?如何为插入模式创建映射,而不是为 Vim 中的自动完成子模式创建映射?
【发布时间】:2011-08-03 11:54:47
【问题描述】:

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

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

它们使 Ctrl-ACtrl-E 将光标移动到不离开插入模式的行,la emacs 键绑定。

但是,我刚刚意识到 Ctrl-E 映射引入了与自动完成子模式的冲突。 :help complete_CTRL-E 中的文档指出:

当完成处于活动状态时,您可以使用 CTRL-E 将其停止并返回到最初键入的文本。

因此,我的 Ctrl-E 映射会干扰这一点。有没有一种方法可以让 Ctrl-E 仅在自动完成未激活时跳转到行尾?

【问题讨论】:

    标签: vim


    【解决方案1】:

    没有合适的方法来测试 Ctrl+X-完成模式是否激活。 但是,以下两种解决方法是可能的。

    1. 如果使用弹出菜单从可用列表中进行选择 完成(尤其是在 completeopt 中设置的 menuone 的情况下 选项),一个可接受的解决方案可能是映射

    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
    

    【讨论】:

    • 或者作为一个不错的表达式映射:inoremap &lt;expr&gt; &lt;c-e&gt; pumvisible() ? "\&lt;c-e&gt;" : "\&lt;c-o&gt;A"
    • 我有completeopt=menu,preview(这是默认设置),但您的解决方案对我来说很好。如果 &lt;c-e&gt; 在自动完成提供单个建议时无法按预期工作,我可以忍受它,因为在那种情况下,我不太可能想拒绝该建议。如果自动完成菜单提供了太多建议,我通常只想关闭它,我可以通过取消它然后再输入几个字符来优化列表。
    • @nelstrom:看来我找到了解决问题的通用方法!请查看答案的最新更新(如果您对新映射有任何问题,请告诉我)。
    • @ib - 这是一个非常聪明的解决方案。干杯!
    • @Peter:请注意,虽然第一个映射可以无缝地转换为表达式映射,但第二个则不能,因为 :normal 命令被阻止在表达式映射中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多