vim - 的行为;重复最后一个t命令让我很烦。您能帮我做得更好吗?

标签 vim

好的,假设我们有一行文字:
[s]tackoverflow rocks
在正常模式下,括号显示光标的位置。按下tr后,您将获得:
stackov[e]rflow rocks
现在是有趣的部分。如果按;重复该命令会怎样?没有! Vim找到下一个“r”(紧接在光标的右边),并将其自身定位在它的左侧(已经存在的位置)。

我希望;将光标移到该位置:
stackoverflow[ ]rocks
这可以通过在按下l之前使用;向右移动一个字符来实现,但是额外的步骤很烦人。 T也有类似的问题,但fF没有类似的问题。有什么方法可以使;tT那样表现出来吗?

最佳答案

也许这不是您要寻找的答案,但是我无法抗拒为此编写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/

    相关文章:

    windows - Vim 插件不适用于病原体

    vim - Vim 命令行模式(ex 模式)下的命令替换

    Vim 编程编辑器速度

    windows - gVim 在使用 --remote-silent 时给出 [Permission Denied]

    vim - VIM:函数名称带有参数的自动完成

    Vim 确定分配给某个键的映射

    windows - Windows : unknown function vundle#begin 上的 Vim Vundle 安装

    vim - 改进 vim 中的 "search under cursor"(gf)

    vim - 为什么 slime-vim 在 paredit 打开时缩进不正确?

    ruby-on-rails - 无法在 Rubymine 或 Vim for Rails 6 中保存和编辑 credentials.yml.enc