的行为; 重复最后一个命令困扰我.你能帮助我做得更好吗?

Dre*_*ank 19 vim

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

[s]tackoverflow rocks

括号在正常模式下显示光标的位置.按下后tr,您会得到:

stackov[e]rflow rocks

现在是有趣的部分.如果你推动;重复命令会发生什么?没有!Vim找到下一个'r'(紧靠光标右侧)并将其自身定位在其左侧(已经存在的位置).

我希望将;光标前进到这个位置:

stackoverflow[ ]rocks

这可以通过l在按下之前使用向右移动一个角色来实现;,但额外的步骤是刺激性的.有一个类似的问题T,但没有fF.有没有一些方法,使;行为我想用的方式tT

glt*_*lts 33

自Vim版本7.3.235起,此烦恼已被修改.现在,默认值是您在第一个位置预期的行为:;使光标在第二个"r"之前跳转到右侧.

这是补丁公告:

补丁7.3.235
问题:";" 卡在"t"命令上,它没用.
解决方案:添加';' 'cpo'中的旗帜.(Christian Brabandt)

旧行为已降级为兼容性选项.你可以带回来:set cpo+=;.见:h cpo-;.


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

好吧,这些事总是比我原先想象的要困难.当前映射存在以下问题:

  1. 假设您进行了tr上述搜索.现在应该做什么d;c;做什么?就我而言,他们应该删除或更改直到第一个r而不是第二个.这可以通过仅针对正常模式和可视模式进行映射来解决,而不是针对操作员暂挂模式.
  2. 当前映射在可视模式下不起作用.即,如果您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)

  • 喜欢"正常!" "正常_;" (2认同)
  • 缺点是当你移动到标准的vim; 映射,它会让你发疯. (2认同)