在我的.vimrc
:
noremap z w
当我检查映射时,:map z
仅显示:
z * w
当我按z
时,我的光标按预期移动(到下一个单词)。但是,当我尝试使用diz
或ciz
之类的内容时,没有任何反应。在我的屏幕底部,我正在输入di
和ci
,但是当我输入z
时,Vim兴高采烈地闲置着。 diw
和ciw
仍然按预期工作。
我还需要做什么?是否有我不知道的映射模式?
答案 0 :(得分:10)
问题是iw
是单个文本对象,它不是修饰符i
+ motion w
。在这种情况下,您需要映射iz
和az
:
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*
文本对象执行相同操作,因为上述代码iz
和az
工作正常;出于某种原因,iw
必须输入太慢或输入为iww
。
答案 1 :(得分:4)
问题不在于尝试绑定到'w',而是在使用'错误'映射。当然,:noremap z w
是您在正常模式下所需的,但在d
或c
之后,Vim不再处于正常模式!
d
和c
等命令进入一种称为“操作员待定模式”的新模式。 Google了解更多信息,或在vim中查看:help Operator-pending
。因此,您想要的是〜/ .vimrc 中的以下附加行:
onoremap z w
之后,diz
和ciz
应该可以正常工作。
答案 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