vi VIM如何将行追加到自身?

4
我想将整个行的内容(不包括结尾换行符)附加到行本身。 我在这里看到了这个解决方案::%s/$/\*/g如何在Vim中为每行末尾添加字符串? 但它会将字符*附加到行上。我尝试了:%s/$/*/g:%s/$/\*/g,但结果相同。
我正在使用 VIM - Vi改进版本7.3.46
PS:似乎作为新用户,我不被允许在那里发布评论。 谢谢。
4个回答

10

再次强调,命令模式非常被低估:

:t.|-j

DONE

:t.|-j!

更新:对于重复项,具有视觉选择类型

:'<,'>g/^/t.|-j

对于可见选择中的每一行都会重复它(当然,在可视模式下会自动插入:'<,'>)。这种方法的另一个好处是,您可以轻松地指定筛选器以复制哪些行:

:g/foo/t.|-j

将当前缓冲区中所有包含 'foo' 的行复制(参见windo,bufdo,argdo以将其扩展到大量缓冲区而无需费力)。


2
它比之前的答案更有帮助,所以我接受了这个答案。@sehe:“命令模式被大大低估了”,这是一个非常有见地的评论。 - Tem Pora
1
@TemPora 感谢你的赞美之词。命令模式需要一定的适应时间。通常只要有行操作,就可以找到相应的命令模式等效操作(例如 %>|%y+|undo 对于在 SO 上发布内容非常方便 :))。 - sehe

6
您可以使用此替代方案:
:s/^.*$/&&
  • ^.*$ 表示"行首 (^) 和行尾 ($) 之间的任意内容 (.*)"。
  • &代表匹配到的文本,因此我们将整行替换为该行两次。

编辑

Ingo的评论很中肯::s/.*/&& 可以少打些字,但实现的功能是一样的。


哇,几分钟内出现了三个不同的答案... 你们今天真的很快啊 :-) - Ingo Karkat
3
不需要使用锚定符号'^...$',因为默认情况下'.'可以匹配任何字符(换行符除外)。要重复匹配整个字符串并在其前后添加相同的内容,可以使用命令':s/.*/&&'。 - Ingo Karkat
1
我已经添加了一个答案,比原来少了4个按键,并且不会影响搜索模式历史记录。请参见https://dev59.com/Z2rXa4cB1Zd3GeqPAZE_#13280126 - 对Ex模式命令的永恒赞美。 - sehe
@sehe:我自己也只是开始使用 Ex 命令。最近我在日常使用中引入了 :m,它非常好用。你的回答太棒了。 - romainl
1
@romainl 万岁 :) g//m$ 很棒,对我来说也用了很多次 - sehe

1

前往您想要追加的行。
然后输入:0y$$p

解释:
0 - 前往行首
y$ - 复制从光标到行尾的所有内容
$ - 前往行尾
p - 粘贴复制的内容


可能值得在开头添加 ^ - Benj
你可以使用 P 代替 $p,因为光标在复制后已经在行首了。 - Ingo Karkat
我知道这个,但我想用一个命令来处理一堆行,类似于 :%s/$/<regex>。谢谢。 - Tem Pora
哦 - 如果你想要重复,可以看看我的 Ex 答案::g/^/t.|-jg/pattern/t.|-j 用于特定行(匹配 pattern)。 - sehe

1

为什么不试试:yyPJx

这将把当前行的副本附加到它自己上。

你甚至可以:

noremap,l yyPJx

如果你想映射一个按键来完成这个操作,在你的.vimrc中。


2
值得注意的是,J 命令会通过删除缩进并插入最多 2 个空格来调整空白。根据您的需求,也许可以考虑使用 gJ 命令。 - Peter Rincker
@PeterRincker 谢谢Peter,gJ肯定是一个不错的选择,正如你所说,这取决于需求。 - Benj

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