繁体   English   中英

Vimrc映射不符合预期

[英]Vimrc mapping not behaving as expected

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

这应该做什么。 但是我不太确定为什么会这样工作。 当您更改映射中的计数时,似乎旧计数不会被清除,而新计数将附加到旧计数上。 (注意,我在映射中只放置了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')

要解决此问题,您必须中止先前键入的计数。 <C-\\><Cn>在正常模式下的作用类似于<Esc> ,但是在没有待处理的计数时避免发出蜂鸣声:

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

对于可视模式,需要使用gv重新建立选择:

vmap 1j <C-\><C-n>gv10j

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM