加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

vim – 的行为;重复最后一个t命令困扰我。你能帮我做得更好吗

发布时间:2020-12-15 19:06:11 所属栏目:安全 来源:网络整理
导读:好的,假设我们有一行文本: 粘性岩石 其中括号显示光标的位置,处于正常模式。按tr后,你会得到: stackov [e] rflow岩石 现在有趣的部分。如果你推,会发生什么?重复命令?没有! Vim找到下一个“r”(立即在光标右侧),并将其自身位于该位置(已经存在的位
好的,假设我们有一行文本:

粘性岩石

其中括号显示光标的位置,处于正常模式。按tr后,你会得到:

stackov [e] rflow岩石

现在有趣的部分。如果你推,会发生什么?重复命令?没有! Vim找到下一个“r”(立即在光标右侧),并将其自身位于该位置(已经存在的位置)。

我宁愿将光标移动到此位置:

stackoverflow []岩石

这可以通过使用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

好的,这些东西总是比我原来想的更难。目前的映射有以下问题:

>假设你像上面那样做了一个搜索。现在应该d或c;做?就我而言,他们应该删除或更改,直到第一个不是第二个。这可以通过仅对正常和可视模式进行映射来解决,而不是操作符挂起模式。
>当前的映射在视觉模式下不起作用。即,如果你输入v ;;;;第一次编辑器不再处于视觉模式(因为:调用)。这可以通过使用@ =而不是: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,")<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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读