好的,假设我们有一行文本:
粘性岩石
其中括号显示光标的位置,处于正常模式。按tr后,你会得到:
stackov [e] rflow岩石
现在有趣的部分。如果你推,会发生什么?重复命令?没有! Vim找到下一个“r”(立即在光标右侧),并将其自身位于该位置(已经存在的位置)。
我宁愿将光标移动到此位置:
stackoverflow []岩石
这可以通过使用l在按压之前向右移动一个字符来实现;但额外的步骤是刺激性的。 T有一个类似的问题,但不是f和F.有没有办法呢?用t和T表现我想要的方式?
也许这不是你正在寻找的答案,但我无法抗拒为此写一个VIM脚本。我把它放在我的.vimrc中,它适用于我:
原文链接:https://www.f2er.com/bash/387321.htmlmap ; :call Semicolon()<CR> function Semicolon() let s:pos1 = getpos(".") normal! ; let s:pos2 = getpos(".") if s:pos1 == s:pos2 normal! 2; endif endfunction
基本思想是不会移动到下一场比赛,而是2;将(如果有匹配)。脚本支持;之后任何tTfF。实现该命令的最简单方法是为此编写一个类似的功能。
编辑
在Luc的优秀建议之后更改了脚本
EDIT2
好的,这些东西总是比我原来想的更难。目前的映射有以下问题:
>假设你像上面那样做了一个搜索。现在应该d或c;做?就我而言,他们应该删除或更改,直到第一个不是第二个。这可以通过仅对正常和可视模式进行映射来解决,而不是操作符挂起模式。
>当前的映射在视觉模式下不起作用。即,如果你输入v ;;;;第一次编辑器不再处于视觉模式(因为:调用)。这可以通过使用@ =而不是:call调用函数来解决。
所以现在我最终在我的.vimrc(我还为…和…做了一个函数):
" Remap ; and,commands so they also work after t and T " Only do the remapping for normal and visual mode,not operator pending " Use @= instead of :call to prevent leaving visual mode nmap ; @=FixCommaAndSemicolon(";")<CR> nmap,@=FixCommaAndSemicolon(",")<CR> vmap ; @=FixCommaAndSemicolon(";")<CR> vmap,")<CR> function FixCommaAndSemicolon(command) let s:pos1 = getpos(".") execute "normal! " . a:command let s:pos2 = getpos(".") if s:pos1 == s:pos2 execute "normal! 2" . a:command endif return "" endfunction