gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:27:26 25 4
gpt4 key购买 nike

好的,假设我们有一行文字:
[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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com