【问题标题】:Quickest way to change a pair of parenthesis to brackets in vim在vim中将一对括号更改为括号的最快方法
【发布时间】:2014-10-13 19:57:55
【问题描述】:

我是 vim 的新手,并且在发现使用这个强大的编辑器可以发现大量有趣的东西的过程中。

我需要经常做的一件特别的事情是将文本中的一对括号更改为方括号(例如将( (a+b+c) )更改为[ (a+b+c) ]),反之亦然。我现在通过手动将两个字符 () 更改为 [] 来做到这一点。

但是,当括号之间有很多文本时,可能很难找到这对左括号和右括号,尤其是因为将第一个 ( 更改为 [ 之后,% 命令将再也找不到对应的)

我想知道是否有更好更快的方法来进行此类更改?

【问题讨论】:

    标签: vim matching parentheses


    【解决方案1】:

    我个人使用https://github.com/tpope/vim-surround,因为它提供了我可能需要的一切,阅读源代码您会发现解决方案非常重要。

    一个典型的例子:

    Hello("World")
    

    光标在()之间,可以正常输入cs([获取方式:

    Hello["World"]
    

    surround.vim 很容易与 Pathogen 或 Vundle 一起安装,我个人更喜欢 vundle。 https://github.com/VundleVim/Vundle.vim

    添加重要的注释点:

    cs([ adds spaces in the block, this should be cs)]
    

    【讨论】:

    • 那个 vundle 链接已经过时了。
    • cs([ 在块中添加空格,这应该是cs)]
    • 对于使用 IdeaVim(带有 IntelliJ IDE)的任何人,vim-surround 已经包含在内。您可以使用:set surround 启用此功能。
    【解决方案2】:

    我会这样做:%r]^or[

    这里有一个解释:

    • f( -- 将光标放在要更改的第一个括号上(如果它不存在)。
    • % -- 跳转到匹配的括号。
    • r] -- 用括号替换括号。
    • CTRL-O -- 跳回第一个括号。
    • r[ -- 用括号替换括号。

    【讨论】:

    • 正如 LucHermitte 提到的,你也可以使用%r]``r[
    • 快速注意,在前导之前编辑尾部括号,否则vim将无法使用%找到尾部括号
    【解决方案3】:

    surround.vim https://github.com/tpope/vim-surround

    使用此插件,您可以(光标在( 上或中)、cs([ 来实现您的目标。

    【讨论】:

      【解决方案4】:

      使用lh-brackets,我将使用<m-b>( 将任何一对类似括号的字符(光标在该对的第一个/最后一个字符上)更改为一对括号。 <m-b>{ -> 大括号,等等。

      对于好奇的人,这是how,它可以工作——请参阅s:ChangeTo()。在内部,我做一个%r]``r[,我对引号字符有专门的处理。

      【讨论】:

      • 赞成这个,因为我真的很喜欢 %r]``r[ 你在评论中提到的这个页面上的另一个答案,你在你的映射中使用它。它只使用内置的 vim 功能,并且一直困扰着我。
      • 谢谢@Randall。实际上,我最近重写了它以支持引号字符。这个函数现在有点复杂了。顺便说一句,我已经更新以链接到“新”github repo。
      【解决方案5】:

      没有任何插件,可以通过删除括号内的内容并拉入新括号(从括号内的任何位置)来完成:

      di(a[]<esc>P%2X
      

      显然比使用surround 更重要,但不是那么多;-)

      注意

      无需记住键的顺序,只需从删除括号内部开始即可。然后就是普通的 vim fu。

      【讨论】:

      • 看起来不对。它似乎没有正确删除初始周围的括号。这就是我想出的:yi)ca)[&lt;c-r&gt;0]&lt;esc&gt;
      • @Peter,你可以把ca)改成c%
      • @peter:我删除括号里面,插入一些新的括号,在它们之间插入删除的内容,然后删除最初的括号2x
      • @mb14 我明白你的目的。删除括号的2x[% 动作之后的光标处将不起作用。相反,它将删除一个[ 和左边的一个字符。要查看此设置测试用例,( (a+b+c) )。将光标放在其中一个外部括号上并运行:exe "norm! di(a[]\&lt;esc&gt;P%2x"。这将执行你的 vim sn-p 没有任何映射你可以看到我看到的。
      • 我实际上是在我的映射深处做%r]``r[,它甚至更短,并且仅当光标位于第一个字符上时才有效。
      【解决方案6】:

      基于围绕这个问题的一些 SO(请参阅我在 @mb14 回答 here 中的评论),我正在考虑这样的肌肉记忆:

      di(a<bkspace><bkspace>[]<Esc>P
      

      但我真正想要做的是:

      di(c%[]<Esc>P
      

      您将看到您不能这样做,因为c() 括号放入您的0 寄存器中,因此您实际上需要这样做:

      di("_c%[]<Esc>P
      

      或者(我也在尝试一种“猛拉”方法并想出了)这个:

      yi(ca([]<Esc>"0P
      

      好的,两者都不是太糟糕,但我想到如果我将 &lt;leader&gt;c 映射到 "_c 以便我有一个真正的删除并且可以这样做:

      di(\c%[]<Esc>P
      

      或者这个:

      yi(\ca([]<Esc>P
      

      两者都非常接近我想要做的事情,并且思考过程为我提供了$MYVIMRC 中最有价值的行之一:

      noremap <leader>c "_c
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-12
        • 2020-07-17
        • 2021-10-12
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 2011-12-09
        • 2015-07-06
        相关资源
        最近更新 更多