Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 行为;重复最后一个t命令让我很烦恼。你能帮我做得更好吗?_Vim - Fatal编程技术网

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