在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
将光标放在第二个*
上,我处于正常模式。
奇怪的是,如果我手动输入命令,它适用于两种类型的列表。为什么这不适用于映射?
答案 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
此备选方案具有更改@/
注册表(使用/
或?
进行上次搜索时使用的模式)的副作用。如果这很麻烦,你可以在执行替换之前保存其内容并在结束时恢复它。