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

时间:2011-06-16 02:54:23

标签: vim

在我的.vimrc

noremap z w

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

z         * w

当我按z时,我的光标按预期移动(到下一个单词)。但是,当我尝试使用dizciz之类的内容时,没有任何反应。在我的屏幕底部,我正在输入dici,但是当我输入z时,Vim兴高采烈地闲置着。 diwciw仍然按预期工作。

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

5 个答案:

答案 0 :(得分:10)

问题是iw是单个文本对象,它不是修饰符i + motion w。在这种情况下,您需要映射izaz

onoremap iz iw
onoremap az aw

。请注意,这将等待您仅按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')

您必须对所使用的所有i*a*文本对象执行相同操作,因为上述代码izaz工作正常;出于某种原因,iw必须输入太慢或输入为iww

答案 1 :(得分:4)

问题不在于尝试绑定到'w',而是在使用'错误'映射。当然,:noremap z w是您在正常模式下所需的,但在dc之后,Vim不再处于正常模式!

dc等命令进入一种称为“操作员待定模式”的新模式。 Google了解更多信息,或在vim中查看:help Operator-pending。因此,您想要的是〜/ .vimrc 中的以下附加行:

onoremap z w

之后,dizciz应该可以正常工作。

答案 2 :(得分:2)

我认为原因很简单:

  

iw“内心词”,选择[count]   单词(见| word |)。白色空间   单词之间也是计算在内的。什么时候   用于视觉线性模式“iw”   切换到Visual characterwise   模式。

你可以将w重新映射到z,但是iw是一个命令,而不是i + w。 例如:dz适用于:

  

:omap z iw

答案 3 :(得分:1)

我不认为vim允许你重新映射动作 - 在你的例子中,'w'是动作('iw')的一部分,而不是命令。

将“z”键重新包含在“w”命令中,因为vim允许您重新映射命令。

答案 4 :(得分:0)

这可能是因为'z'本身用于一系列命令。退房:h z