如何在 Vim 中在每一行的末尾添加文本?

在 Vim 中,我有以下文本:

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

我想在每一行的末尾加上“ ,”前面的文字将变成如下:

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

是否有人知道如何做到这一点? 是否有可能使用视觉块模式来完成这一点?

131898 次浏览

Ex 模式最简单:

:%s/$/,


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

$火柴结束行

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

:%s/$/,/

如果希望执行行的子集而不是整个文件,可以指定它们来代替 %

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

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

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

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

这个替换应该适用于您的示例,假设您真的希望像您提到的那样在 每行的末尾处使用逗号。如果有尾随空格,则可能需要相应地调整命令:

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

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

相同的命令可以操作一系列行,例如,对于接下来的5行: :,+5s/$/,/,或者对于整个缓冲区: :%s/$/,/

另一个解决方案,使用了另一个很棒的特性:

:'<,'>norm A,

参见 :help :normal

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

:%s/key.*$/&,

实际上,有一种方法可以使用 Visualblock 模式来实现这一点。在 Visualblock 模式下,只需按 $A即可将选定内容中的所有行的结尾追加到该行。当您按下 Esc时,附加的文本将出现在所有行上。

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

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

也就是说,在正常模式下,可视化选择一个段落 vip,切换到可视化块模式 CTRLV,在所有行 $A后面添加一个逗号 ,,然后按 Esc确认。

文档在 :h v_b_A。甚至在例子部分有一个它是如何工作的说明: :h v_b_A_example

我已经将 <M-DOWN>(Alt 下箭头)映射到 <DOWN>.,这样我可以在一系列行上非常快速地重复最后一个命令。通过这个映射,我可以:

A,<ESC>

然后按住 alt,同时反复向下按,在每一行的末尾添加逗号。
这对我来说很有用,因为它可以很好地控制哪些行做了改变,哪些行没有改变。
(我还有其他类似的箭头映射,以便于重复 .)

下面是要粘贴到 vimrc 中的映射行:

map <M-DOWN> <DOWN>.

下面的宏也可以用来完成你的任务。

qqA,^[0jq4@q