Vim/Nvim中omap ge的异常行为咨询及原因探究
Vim/Nvim中操作符与
ge动作结合的异常行为解析 针对你在Vim 8.2、Vim 9和Nvim 0.10.2中发现的两类异常行为,结合Vim手册规则解释如下(以d操作符为例,规则适用于y、c等操作符):
案例1:dNge(N≥2)无删除动作
场景回顾
缓冲区内容:
␊ abc␊
光标位于b处,dge正常删除a和b,但d2ge/2dge仅将光标移至第一行开头,无内容删除。
手册规则解析
ge动作的重复逻辑:根据Vim手册,ge的作用是跳转到前一个单词的结尾;若当前行无前置单词,则跳至上一行的结尾尝试;若已到文件开头则停止移动。- 执行
2ge时,第一次从b跳至a(当前单词abc的开头,即前置单词的结尾),第二次因a是行首无前置单词,跳至第一行的空行开头。
- 执行
- 反向范围的处理逻辑:当操作符的动作终点位于起点的上方/左侧时,Vim会交换范围的起止点,但如果交换后的范围包含空行+行首字符的组合,Vim会判定该范围无有效可删除字符(空行本身无字符,行首字符的范围计算因字符wise动作的特性出现冲突),因此不执行删除,仅移动光标到动作终点。
2dge的等效性:2dge是重复两次dge,第一次删除a和b后光标到c,第二次ge跳至第一行开头,此时范围是c到第一行开头,同样被判定为无效范围,最终无删除动作。
案例2:光标在a处执行dge无变化
场景回顾
缓冲区内容:
abc␊
光标位于a处,db因b是排他性动作无变化,dge作为包容性动作也无变化。
手册规则解析
ge的边界行为:根据Vim手册,当光标位于文件首行首字符时,ge因无前置单词也无上一行,会保持原地不动。- 空范围的判定规则:Vim中,无论动作是包容性还是排他性,只要动作未产生位置移动,就会判定操作范围为空。即使
ge是包容性动作,dge的范围是光标自身到自身,Vim也不会执行删除(因为没有跨越任何字符),因此表现与db一致。
内容的提问来源于stack exchange,提问作者Kaiwen
相关产品推荐
相关产品推荐

