好的,假设我们有一行文字:
[s]tackoverflow rocks
括号在正常模式下显示光标的位置.按下后tr,您会得到:
stackov[e]rflow rocks
现在是有趣的部分.如果你推动;重复命令会发生什么?没有!Vim找到下一个'r'(紧靠光标右侧)并将其自身定位在其左侧(已经存在的位置).
我希望将;光标前进到这个位置:
stackoverflow[ ]rocks
这可以通过l在按下之前使用向右移动一个角色来实现;,但额外的步骤是刺激性的.有一个类似的问题T,但没有f和F.有没有一些方法,使;行为我想用的方式t和T?
Pet*_*den 10
也许这不是您正在寻找的答案,但我无法抗拒为此编写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
Run Code Online (Sandbox Code Playgroud)
基本的想法是;不会移动到下一场比赛,但2;会(如果有匹配).该脚本支持;任何后tTfF.实现该,命令的最简单方法是为此编写类似的函数.
编辑 在Luc的出色建议之后改变了剧本
EDIT2
好吧,这些事总是比我原先想象的要困难.当前映射存在以下问题:
tr上述搜索.现在应该做什么d;或c;做什么?就我而言,他们应该删除或更改直到第一个r而不是第二个.这可以通过仅针对正常模式和可视模式进行映射来解决,而不是针对操作员暂挂模式.v;;;;在第一个之后键入;编辑器不再处于可视模式(因为:call).这可以通过使用@=而不是调用函数来解决: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 , @=FixCommaAndSemicolon(",")<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
Run Code Online (Sandbox Code Playgroud)