vim:将包含pattern的行移动到上一行的末尾

时间:2013-12-10 06:11:39

标签: regex vim

A : 
A()
A :
A(int)

to     

A : A()
A : A(int)

A()是我正在搜索的模式(多行),并尝试将其附加到上一行。

2 个答案:

答案 0 :(得分:10)

使用

:norm J

适用于您当前的输入,但我认为搜索是必需的,因此您可以使用这样的全局命令

:g/\vA\(.{-}\)/normal kJ

击穿

g              -- start global command
\vA\(.{-}\)/   -- search for A followed by (<anything>)
normal kJ      -- for each match, execute k (line up), J (join lines)

修改 (cudo's to Peter)

在命令行模式下-j与正常情况下的kJ等效,您可以将其缩短为

:g/\vA\(.{-}\)/-j

甚至更短

:g/\vA\(.*\)/-j

但我个人更喜欢懒惰({ - })而不是贪婪(*)量词。

答案 1 :(得分:0)

我会去代替:

:%s#^\s*\(\k\+\)\s*:\zs\s*\n\_s*\ze\1(.*)# #

这样,它会检查冒号两边的名称是否匹配 - 它可以是AfoobarB,任何东西,而你不是需要每次都指定它。

\zsze分隔模式(同一行上的任何空格,换行符和任何空格(包括换行符))将用单个空格替换。围绕\z的内容作为匹配适用的上下文。