vim:非数字列表映射中的<ctrl-a>行为</ctrl-a>

时间:2014-08-27 15:26:36

标签: vim mapping

在vim中,我想使用以下映射自动插入带有列表引导的新行。

imap <buffer> <C-CR> <ESC>Yp<C-A>WC

想法是复制当前行(<ESC>Yp),增加前导数(<C-A>),跳转到下一个单词(W)并更改行的其余部分(C)。例如:

    1. Hello|<C-CR>

给了我

    1. Hello
    2. |

其中|是光标位置,我最终处于插入模式。

由于<C-A>是针对项目符号列表的无操作,因此我希望它的工作方式完全相同,但它并不是。如果我做

    * Hello|<C-CR>

我得到了

    * Hello
    * Hello

将光标放在第二个*上,我处于正常模式。

奇怪的是,如果我手动输入命令,它适用于两种类型的列表。为什么这不适用于映射?

3 个答案:

答案 0 :(得分:1)

这是一个解决方法,适用于您的两种情况,甚至认为它有点脏。 : - )

imap  <c-cr> <esc>YpA1<esc>^<c-a>$x0WC

答案 1 :(得分:1)

是的,mMontu mentioning the 'beep'让我this wiki entry直接解决了我的问题。所以现在我用

inoremap <buffer> <C-CR> <ESC>Yp:exec "normal! \<C-A>"<CR>WC

在exec命令中“包装”错误,该命令不会产生蜂鸣声/错误。我现在觉得很恶心,但是做了它应该做的事情,所以我想它必须这样做。

答案 2 :(得分:0)

在没有数字的行中执行<C-A>时,会发出一声嘟嘟声。

当您在子弹列表上执行映射时,会出现同样的蜂鸣声。 <C-A>命令失败导致执行剩余的映射。

您可以使用:substitute命令进行增量,使用&#39; e&#39;如Vim-FAQ 11.15

中所述,标志以避免失败
inoremap <buffer> <C-CR> <ESC>Yp:s/\v(\d+)/\=submatch(1)+1/e<CR>WC

此备选方案具有更改@/注册表(使用/?进行上次搜索时使用的模式)的副作用。如果这很麻烦,你可以在执行替换之前保存其内容并在结束时恢复它。