【问题标题】:How to add text at the end of each line in Vim?如何在 Vim 中的每一行末尾添加文本?
【发布时间】:2012-07-03 10:04:31
【问题描述】:

在 Vim 中,我有以下文本:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

我想在每行末尾添加“,”。之前的文字会变成下面这样:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

有人知道怎么做吗?是否可以使用可视块模式来完成此操作?

【问题讨论】:

标签: vim


【解决方案1】:

这将对文件中的每一行执行此操作:

:%s/$/,/

如果您想要执行部分行而不是整个文件,可以指定它们来代替 %

一种方法是进行视觉选择,然后输入:。它将为您填写:'<,'>,然后您输入其余部分(注意您只需添加s/$/,/

:'<,'>s/$/,/

【讨论】:

  • 最后一行多了一个',应该是:'&lt;,'&gt;s/$/,/
  • 为什么不需要g? (:'&lt;,'&gt;s/$/,/g)
  • @ThorbjørnE.K.Christensen 因为/$/ 无论如何只匹配一次。
【解决方案2】:

实际上有一种方法可以使用可视块模式来执行此操作。只需在可视块模式下按$A 即可附加到所选内容中所有行的末尾。按下 Esc 后,附加文本将出现在所有行上。

所以这是一个可能的解决方案:

vip<C-V>$A,<Esc>

即在Normal模式下,Visual选择一段vip,切换到Visual block模式CTRLV,在所有行后面追加$A一个逗号@ 987654328@,然后按Esc确认。

文档位于:h v_b_A。甚至在示例部分中还说明了它是如何工作的::h v_b_A_example

【讨论】:

  • 不,这是标准 Vim:在可视块模式下选择一些行(使用 C-V)然后将光标移动到行尾 $ 并附加到所有行 A .你会喜欢:h v_b_A,这真的很彻底。
  • 哦,我明白发生了什么事!我通常使用 Ctrl-C 而不是 退出插入模式,显然使用 Ctrl-C 这不起作用!多么奇怪。
  • 您可以使用&lt;C-V&gt;ip 代替vip&lt;C-V&gt; 来保存击键。
  • @accolade,这样不会进入可视块模式,也不会工作。如果你这样做, 需要再次发生。
  • @NoelEvans 因为vip 将光标放在选择的左下角,而A 对视觉模式没有特殊意义(请与:vmap A 核对)。使用oO 似乎无法将光标移动到右侧边缘,因为它们仅适用于可视块模式,vip 不会产生块选择(请参阅:h v_o)。这可能还不够,除非一个角比其他所有角都长。
【解决方案3】:

另一个解决方案,使用另一个很棒的功能:

:'<,'>norm A,

:help :normal

【讨论】:

  • @Swiss,那么你会喜欢this comment
  • @Swiss,您可能还喜欢udioca's exposé 上的:normal。我发现它内容丰富!
  • 不知道这个 subreddit。谢谢。
【解决方案4】:

ex 模式最简单:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma

【讨论】:

    【解决方案5】:

    替代命令可以应用于视觉选择。在要更改的行上创建一个可视块,然后键入 :,并注意命令行的初始化如下::'&lt;,'&gt;。这意味着替换命令将对视觉选择进行操作,如下所示:

    :'<,'>s/$/,/
    

    这是一个应该适用于你的例子的替换,假设你真的想要逗号在每行的末尾,就像你提到的那样。如果有尾随空格,那么您可能需要相应地调整命令:

    :'<,'>s/\s*$/,/
    

    这将用逗号替换行尾之前的任意数量的空格,从而有效地删除尾随空格。

    相同的命令可以在一系列行上运行,例如接下来的 5 行::,+5s/$/,/,或整个缓冲区::%s/$/,/

    【讨论】:

      【解决方案6】:

      如果要在以“key”开头的行末尾添加“,”,请使用:

      :%s/key.*$/&,
      

      【讨论】:

      • :g/key/s/$/,。见:help :global
      【解决方案7】:
      :%s/$/,/g
      

      $ 匹配行尾

      【讨论】:

      • 这也会将$ 添加到该行中,而不仅仅是,
      • /g 用于对一行中的每个匹配项执行替换。因为一行中只有一个$,所以您可以放心地删除它。
      • 是的,我在 ,$ 上的错误。 /g 来自习惯,是的,它是可选的。
      【解决方案8】:

      我将&lt;M-DOWN&gt;(alt 向下箭头)映射到&lt;DOWN&gt;.,这样我就可以非常快速地在一系列行上重复最后一个命令。有了这个映射,我可以:

      A,<ESC>
      

      然后在按住 alt 的同时反复按下以将逗号附加到每行的末尾。
      这对我来说效果很好,因为它可以很好地控制哪些行会发生变化,哪些行不会发生变化。
      (我也有类似映射的其他箭头,以便轻松重复 .

      这是要粘贴到您的 vimrc 中的映射行:

      map <M-DOWN> <DOWN>.
      

      【讨论】:

        【解决方案9】:

        Following Macro 也可以用来完成你的任务。

        qqA,^[0jq4@q
        

        【讨论】:

          猜你喜欢
          • 2014-05-29
          • 1970-01-01
          • 2010-10-10
          • 2013-04-05
          • 1970-01-01
          • 2021-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多