在 vim 中进行键映射时命令计数丢失

count of command get lost when do key mapping in vim

我的 vimrc 文件中有 p 的按键映射,如下所示:
noremap p <ESC>:set paste<CR>p:set nopaste<CR>

此键映射的目的是确保vim以外的内容可以在粘贴模式下以其原始格式粘贴。粘贴完成后恢复为nopaste模式

但是当我运行以下命令时:

yy
5p

p只执行了一次而不是5次。
键映射中似乎遗漏了计数。

有什么方法可以在键映射中传递计数?
或者如何解决这个问题?

第一个 <ESC> 降低了计数,因此以后无法使用。我们将忽略 <ESC> 并使用 <c-u> 保存计数,稍后使用 v:count1 变量访问它,例如 :<c-u>set paste <CR>... v:count1 ....

但是还有一个问题:count会在第一个<CR>之后丢失,所以我们想将映射重写为一个命令。命令链可以用 | 完成,但在映射中我们应该写 <BAR> 而不是 |.

这是最终的映射:

:noremap p :<c-u>set paste <BAR> :exe "normal! " . v:count1 . "p" <BAR> :set nopaste<CR>

:exe "normal! " 是一种从评估的字符串执行命令的奇特方法。