在Vim中,为什么我不能将键重新映射到`w`?

Clo*_*boy 7 vim

在我的.vimrc:

noremap z w
Run Code Online (Sandbox Code Playgroud)

当我检查映射时,:map z仅显示:

z         * w
Run Code Online (Sandbox Code Playgroud)

当我按下时z,我的光标按预期移动(到下一个单词).然而,当我尝试使用类似diz或者ciz,什么都不会发生.在我的屏幕的底部,dici显示为我打字他们,但是当我键入z时,Vim兴高采烈地闲置.diwciw预期仍然工作.

我还需要做什么?是否有我不知道的映射模式?

ZyX*_*ZyX 10

问题是iw单个文本对象,它不是修饰符i+运动w.你需要映射iz,az在这种情况下:

onoremap iz iw
onoremap az aw
Run Code Online (Sandbox Code Playgroud)

.请注意,这将等待您z仅按下一段时间(请参阅参考资料:h 'timeoutlen').为了让它像iw(例如,z永远等待)一样工作,你应该尝试以下方法:

function s:MapTOPart(tostart)
    let char=getchar()
    if type(char)==type(0)
        let char=nr2char(char)
    endif
    return a:tostart.((char is# 'z')?('w'):(char))
endfunction

onoremap iz iw
onoremap az aw
onoremap <expr> i <SID>MapTOPart('i')
onoremap <expr> a <SID>MapTOPart('a')
Run Code Online (Sandbox Code Playgroud)

你将不得不对所有做同样i*a*文本对象,你只用上面的代码,因为使用izaz正常工作; 由于某种原因,iw必须键入太慢或键入iww.