0

我在视觉和正常模式下创建了一个映射,以加快在本地代码区域中的移动。如果我按 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'。这使我向下移动了 110 行而不是 11 行。

当我犯这个错误时,我只想在给定的方向上移动 11 而不是 110。

Vim 将其解释为 1,然后添加我的映射以获得 110。同样,如果我键入 '21j',它会被解释为 '210j'。

4

2 回答 2

2

这应该做你。但是我不确定为什么它会这样工作。当您更改映射内的计数并将新计数附加到旧计数时,旧计数似乎不会被清除。(请注意,我只在映射中放了一个 0 而不是 10)

我还习惯于v:count查找映射的计数而不是重载1jv: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')
于 2013-09-06T03:57:33.320 回答
1

要解决此问题,您必须中止先前键入的计数。<C-\><C-n><Esc>在正常模式下一样工作,但在没有挂起计数时避免发出哔声:

nmap 1j <C-\><C-n>10j

对于视觉模式,需要重新建立选择gv

vmap 1j <C-\><C-n>gv10j
于 2013-09-06T07:05:16.083 回答