Vim 行为;重复最后一个t命令让我很烦恼。你能帮我做得更好吗?
好的,假设我们有一行文本:Vim 行为;重复最后一个t命令让我很烦恼。你能帮我做得更好吗?,vim,Vim,好的,假设我们有一行文本: 其中括号显示正常模式下光标的位置。按tr后,您会得到: stackov[e]rflow rocks 现在来看有趣的部分。如果按下,会发生什么是否重复该命令?没有什么!Vim找到下一个“r”(紧靠光标右侧),并将自身定位在该“r”的左侧(它已经位于的位置) 我更喜欢将光标前进到此位置: stackoverflow[]岩石 这可以通过使用l在按下之前向右移动一个字符来实现,但额外的步骤令人恼火。T也有类似的问题,但f和f则没有。有什么方法可以使
其中括号显示正常模式下光标的位置。按tr
后,您会得到:
stackov[e]rflow rocks
现在来看有趣的部分。如果按下,会发生什么
是否重复该命令?没有什么!Vim找到下一个“r”(紧靠光标右侧),并将自身定位在该“r”的左侧(它已经位于的位置)
我更喜欢代码>将光标前进到此位置:
stackoverflow[]岩石
这可以通过使用l
在按下之前向右移动一个字符来实现代码>,但额外的步骤令人恼火。T
也有类似的问题,但f
和f
则没有。有什么方法可以使用t
和t
表现出我想要的方式?2评论一:你能映射吗;你要找的中尉司令部?第二:为什么不使用2tr或/r后跟n呢?听起来你的问题更多的是t
的行为,而不是代码>
在您的示例中,假设您从“e”开始:
stackov[e]rflow rocks
我猜你会(合理地)期望tr
跳到[]岩石上,而不是呆在原地
如果是这样,您应该离开代码>按原样,可能会将t
重新映射到lt
或其他东西。也许这不是您要寻找的答案,但我忍不住为此编写了一个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
自Vim版本起,此烦恼已被修改。现在,默认设置是您最初期望的行为:代码>使光标跳到第二个“r”之前的右侧
这是补丁发布:
补丁7.3.235
问题:“;”卡在“t”命令上,它没有用。
解决方案:添加“;”“cpo”中的标志。(克里斯蒂安·布拉班德)
旧行为已降级为兼容选项。您可以使用将其带回来:设置cpo+=代码>。参见:h cpo-代码>我不知道如何重新映射;因为我希望根据上次发出的t/t/f/Fx命令的不同,它可以处理不同的事情。另外,我通常不喜欢ntx,因为我不喜欢通过计算字符来知道使用什么n。我发现,只要按“重复”键,直到我到达我要去的地方,对我的信息流的干扰就更少了。这真的是一个相当小的问题,也许我应该只是/而不是:P.我同意这很烦人-使用tTfF而不是/肯定有很多理由。我不知道它为什么会这样-我最好的猜测是,如果您在发出上一个tT命令后移动了很多,那么它的设计就是让您感觉正确的,所以您不想假设您已经注意到光标正前方的匹配。这一点很好。然而,从我所知道的来看,
是与tTfF
命令分开实现的人——即使我按照您的建议重新映射t
,它也不会改变的行为代码>。更喜欢“正常!;”而不是“正常”@Luc-好建议。我真的在寻找这样的选择,但没有找到。我会编辑我的脚本这太完美了谢谢!出于好奇,你为什么认为这不是我想要的答案?使用这样的脚本有缺点吗?@Drew-AFAIK脚本没有缺点(除了污染你的.vimrc)。这可能只是因为您正在寻找一个简单的命令来实现这一点,而不是涉及脚本的东西;地图,这会让你发疯的。谢谢你提醒我,@glts!对于那些不熟悉这些命令的人,t{char}
是“直到{char}的运动”。分号
将重复最后一个t
命令。
" 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