vim – 的行为;重复最后一个t命令困扰我你能帮我做得更好吗

好的,假设我们有一行文本:

粘性岩石

其中括号显示光标的位置,处于正常模式。按tr后,你会得到:

stackov [e] rflow岩石

现在有趣的部分。如果你推,会发生什么?重复命令?没有! Vim找到下一个“r”(立即在光标右侧),并将其自身位于该位置(已经存在的位置)。

我宁愿将光标移动到此位置:

stackoverflow []岩石

这可以通过使用l在按压之前向右移动一个字符来实现;但额外的步骤是刺激性的。 T有一个类似的问题,但不是f和F.有没有办法呢?用t和T表现我想要的方式?

也许这不是你正在寻找的答案,但我无法抗拒为此写一个VIM脚本。我把它放在我的.vimrc中,它适用于我:
map ; :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

相关文章

解决方案:解决linux下vim乱码的情况:(修改vimrc的内容)全...
Linuxvi/vim所有的UnixLike系统都会内建vi文书编辑器,其他的...
      vim正则匹配:空行:/^$/  /^[\t]*$/注释...
$select-editorSelectaneditor.Tochangelater,run'sele...
上次手贱忘了保存,这次就简单做个备忘吧,把踩过的坑记一下...
Linux之文本编译器小结vim的优势所有的UNIX-LIKE习通都会内置...