我已经在视觉和普通模式下创建了一个映射,以加快在本地代码区域中的移动。如果我按1 +方向键,它将被重新映射到10而不是1。
vmap 1j 10j | vmap 1k 10k | vmap 1h 10h | vmap 1l 10l
nmap 1j 10j | nmap 1k 10k | nmap 1h 10h | nmap 1l 10l
这很有效。然而,当我快速输入时,我无意中输入了11而不是1,因此'11j'的'1j'被置入'1'。这让我感动了110行,而不是11行。
当我犯这个错误时,我只想在给定方向上移动11而不是110.
Vim将此解释为1,然后添加我的映射以获得110.同样,如果我输入'21j',它将被解释为'210j'。
答案 0 :(得分:2)
这应该是你做的。但是我不确定它为什么会像它那样工作。当您更改映射内的计数并且新计数附加到旧计数时,似乎不会清除旧计数。 (请注意,我只在映射中输入0而不是10)
我还使用v:count
来查找映射计数,而不是重载1j
。如果未指定计数,则v:count
返回0.
function TenMovement(type)
if v:count == 1
return '0'.a:type
else
return a:type
endif
endfunction
nnoremap <expr> j TenMovement('j')
nnoremap <expr> k TenMovement('k')
nnoremap <expr> l TenMovement('l')
nnoremap <expr> h TenMovement('h')
vnoremap <expr> j TenMovement('j')
vnoremap <expr> k TenMovement('k')
vnoremap <expr> l TenMovement('l')
vnoremap <expr> h TenMovement('h')
答案 1 :(得分:1)
要解决此问题,您必须中止以前输入的计数。 <C-\><C-n>
在正常模式下的工作方式与<Esc>
类似,但在没有待处理的计数时会避免发出蜂鸣声:
nmap 1j <C-\><C-n>10j
对于可视模式,需要使用gv
:
vmap 1j <C-\><C-n>gv10j