我正在进行正常模式映射,偶然发现了一些令人惊讶的行为:
首先,这是一个有效的映射,并按我的要求行事:
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?
答案 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>
是表达式返回的位置。