Vimrc映射的行为不符合预期

时间:2013-09-06 03:06:59

标签: vim

我已经在视觉和普通模式下创建了一个映射,以加快在本地代码区域中的移动。如果我按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'。

2 个答案:

答案 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