好的,假设我们有一行文字:[s]tackoverflow rocks
在正常模式下,括号显示光标的位置。按下tr
后,您将获得:stackov[e]rflow rocks
现在是有趣的部分。如果按;
重复该命令会怎样?没有! Vim找到下一个“r”(紧接在光标的右边),并将其自身定位在它的左侧(已经存在的位置)。
我希望;
将光标移到该位置:stackoverflow[ ]rocks
这可以通过在按下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
好吧,这些事情总是比我最初想的要困难。当前的映射存在以下问题:
tr
的搜索。现在d;
或c;
应该做什么?就我而言,他们应该删除或更改直到第一个r
而不是第二个。这可以通过仅对普通模式和可视模式执行映射,而不对运算符(operator)暂挂模式进行映射来解决。 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
关于vim - 的行为;重复最后一个t命令让我很烦。您能帮我做得更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1523602/