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

171

Vim中,我有如下文本:

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

我想在每行末尾添加逗号。修改后的文本如下:

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

有人知道如何做到这一点吗?是否可以使用可视块模式来实现?


类似的问题可以在这里找到:https://dev59.com/E3RB5IYBdhLWcg3wiHv7。 - glts
9个回答

235
这将对文件中的每一行都执行此操作:
:%s/$/,/
如果你只想处理文件的一部分而不是整个文件,你可以在%的位置指定它们。
一种方法是进行可视选择,然后输入:。它将为你填入:'<,'>,然后你输入其余部分(注意你只需要添加s/$/,/)。
:'<,'>s/$/,/

4
最后一行多了一个 ',应该是 :'<,'>s/$/,/ - cjg
为什么不需要 g?(:'<,'>s/$/,/g) - Thorbjørn E. K. Christensen
1
@ThorbjørnE.K.Christensen 因为 /$/ 只匹配一次。 - Bubaya
我不喜欢这样设置@/的方式。有没有其他解决办法? - nullromo

204

实际上可以使用Visual块模式来实现这一点。在Visual块模式下,只需按下$A即可将文本添加到选择区域的所有行的末尾。当您按下Esc时,追加的文本将立即出现在所有行上。

因此,这是一个可能的解决方案:

vip<C-V>$A,<Esc>
那就是,在普通模式下,使用可视模式选择一个段落 vip,切换到可视块模式 CTRLV,在所有行的末尾添加逗号 ,,然后按 Esc 确认。相关文档请参见:h v_b_A,甚至在示例部分有它的工作原理的插图::h v_b_A_example

1
不,这是标准的 Vim:在可视块模式下选择一些行(使用 C-V),然后将光标移动到行末 $ 并向它们附加 A。您会喜欢 :h v_b_A,它非常详细。 - glts
1
哦,我明白了!我通常使用Ctrl-C而不是<Esc>退出插入模式,但显然使用Ctrl-C这样做不起作用!多么奇怪。 - weronika
3
使用<C-V>ip代替vip<C-V>可以节省一个按键。 - Aaron Thoma
1
@accolade,这样做不会进入可视块模式,也不起作用。如果您以这种方式进行操作,则需要再次执行<C-V>。 - imagineerThat
1
@NoelEvans 因为 vip 将光标放置在选择区域的左下角,而在可视模式中 A 没有特殊含义(使用 :vmap A 进行检查)。因此,似乎不可能使用 oO 将光标移动到右侧边缘,因为它们仅适用于可视块模式,而 vip 不会产生块选择(请参阅 :h v_o)。除非一个角落比其他所有角落都长,否则这仍然可能不够用。 - pkfm
显示剩余5条评论

52

另一个解决方案,使用另一个伟大的功能:

:'<,'>norm A,

请查看:help :normal


1
@Swiss,你会喜欢这个评论的(https://dev59.com/UGgu5IYBdhLWcg3wdG6o#m1UEoYgBc1ULPQZFv2Co)。 - romainl
1
@Swiss,你可能也会喜欢udioca的曝光关于:normal的文章。我觉得这篇文章很有启发性! - Conner
1
不知道这个子论坛,谢谢。 - romainl

50

使用 ex 模式最简单:

:%s/$/,

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

12

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

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

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

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

这将用逗号替换在行末可能存在的任意数量的空格,从而有效地去除尾部的空白。

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


5
:%s/$/,/g

$匹配行尾


2
这将在行末添加 $,而不仅仅是 , - ZyX
2
"/g" 用于在每一行中替换每个出现的项。因为一行中只有一个"$",所以可以放心省略它。 - romainl
是的,我的错,关于",$."和"/g"的使用习惯问题,是我惯用的写法,而且是可选的。 - kalhartt

4
如果要在以'key'开头的行末添加',',请使用以下方法:
:%s/key.*$/&,

或者:g/key/s/$/,。请参考:help :global - romainl

3

我已将<M-DOWN>(alt键向下箭头)映射到<DOWN>,这样我就可以非常快速地重复一系列行上的最后一个命令。有了这个映射,我可以:

A,<ESC>

然后按住alt键,同时重复按下逗号键来将逗号追加到每行的末尾。
这个方法很好用,因为它可以非常好地控制哪些行需要进行更改,哪些行不需进行更改。
(我还将其他箭头键映射成类似的方式,以方便重复输入.)

以下是要复制到vimrc文件中的映射代码行:

map <M-DOWN> <DOWN>.

2
以下宏也可以用来完成您的任务。
qqA,^[0jq4@q

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接