在 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! "
是一种从评估的字符串执行命令的奇特方法。
我的 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! "
是一种从评估的字符串执行命令的奇特方法。