vim:strange v:正常模式映射中的count行为

时间:2016-05-13 17:52:44

标签: vim

我正在进行正常模式映射,偶然发现了一些令人惊讶的行为:

首先,这是一个有效的映射,并按我的要求行事:

nnoremap <expr> <leader>_ ':<C-U>normal' . v:count . 'Ix<ESC>'

所以我可以输入3,_,是我的领导角色)并插入3个x个字符。

没问题。但是,我希望这个更简单的工作也可以使用:

nnoremap <expr> <leader>_ v:count . 'Ix<ESC>'

但是,如果我输入3,_,它会插入33个x个字符。 如果我使用4,_,我会得到44,等等。

这是怎么回事?

更重要的是,有没有人知道调试这些东西的好方法,所以我可以看到这个表达式是如何扩展的,而且每次遇到这样的问题时都不必问SO?

1 个答案:

答案 0 :(得分:1)

首先是你的固定映射:

nnoremap <leader>_ Ix<ESC>

默认情况下,{count}将传递到I命令。除非将计数传递到映射的不同部分,否则通常可以将其删除。

为什么以下映射有效?

nnoremap <expr> <leader>_ ':<C-U>normal' . v:count . 'Ix<ESC>'

此处将计数传递到:normal命令,但此映射使用<c-u>清除{count} /范围。您可以通过3: vs 3:<c-u>查看计数。因此,如果没有<c-u>,这种映射就会产生:

:.,+2normal 3Ix<ESC>

使用<c-u>您的映射将会发生:

:normal 3Ix<ESC>

为什么以下映射不起作用?

nnoremap <expr> <leader>_ v:count . 'Ix<ESC>'

仅使用v:count不会清除当前{count}。您需要直接清除{count}或创建利用它的映射。由于这是一个表达式映射,因此以下3,_将转换为33Ix<ESC>。第一个3被赋予计数,3Ix<ESC>是表达式返回的位置。