我想合并Vim中的两个行块,即取行k到l并将它们附加到行m到n。如果您喜欢伪代码解释:[line[k+ I] + line[m+ I] for I in range(min(l-k, n-m)+1)]。
例如,
abc
def
...
123
45
...
应该成为
abc123
def45
有没有一种很好的方法来做到这一点,而无需手动逐行复制和粘贴?
我想合并Vim中的两个行块,即取行k到l并将它们附加到行m到n。如果您喜欢伪代码解释:[line[k+ I] + line[m+ I] for I in range(min(l-k, n-m)+1)]。
例如,
abc
def
...
123
45
...
应该成为
abc123
def45
有没有一种很好的方法来做到这一点,而无需手动逐行复制和粘贴?
当前回答
有很多方法可以做到这一点。我将使用以下两种方法中的任何一种来合并两个文本块。
假设第一个块在第1行,第二个块从第10行开始,游标的初始位置在第1行。
(\n表示按回车键。)
1. abc
def
ghi
10. 123
456
789
与宏使用命令:复制,粘贴和连接。
y \ npkJjq2@a10G3dd qaqqa: + 9
使用宏命令在第n行号移动一行并连接。
qcqqc: 10 m。\ nkJjq2@c
其他回答
样本数据与rampion的相同。
:1,4s/$/\=getline(line('.')+4)/ | 5,8d
下面是我的做法(把光标放在第一行上):
qama:5<CR>y$'a$p:5<CR>dd'ajq3@a
你需要知道两件事:
第二组的第一行开始的行号(在我的例子中是5),以及 每组中的行数(在我的例子中是3)。
事情是这样的:
Qa将下一个q之前的所有内容记录到a中的“缓冲区”中。 Ma在当前线上创建了一个标记。 :5<CR>进入下一组。 Y $ Yanks剩下的线。 'a返回之前设置的标记。 $p粘贴到行尾。 :5<CR>返回第二组的第一行。 Dd删除它。 ’a回到了起点。 Jq走下一行,停止录制。 3@a重复每一行的操作(在我的例子中是3行)
有很多方法可以做到这一点。我将使用以下两种方法中的任何一种来合并两个文本块。
假设第一个块在第1行,第二个块从第10行开始,游标的初始位置在第1行。
(\n表示按回车键。)
1. abc
def
ghi
10. 123
456
789
与宏使用命令:复制,粘贴和连接。
y \ npkJjq2@a10G3dd qaqqa: + 9
使用宏命令在第n行号移动一行并连接。
qcqqc: 10 m。\ nkJjq2@c
正如在其他地方提到的,块选择是可行的方法。但是你也可以使用以下的任何变体:
:!5 .尾部-n - 6% |粘贴-d '\0' % - |头部-n
此方法依赖于UNIX命令行。创建粘贴实用程序是为了处理这种行合并。
PASTE(1) BSD General Commands Manual PASTE(1)
NAME
paste -- merge corresponding or subsequent lines of files
SYNOPSIS
paste [-s] [-d list] file ...
DESCRIPTION
The paste utility concatenates the corresponding lines of the given input files, replacing all but the last file's newline characters with a single tab character,
and writes the resulting lines to standard output. If end-of-file is reached on an input file while other input files still contain data, the file is treated as if
it were an endless source of empty lines.
我觉得不要弄得太复杂。 我会设置virtualedit (:设置virtualedit =) 选择123块和下面所有的。 把它放在第一列之后:
abc 123
def 45
... ...
并将其中的多重空格移除为1个空格:
:%s/\s\{2,}/ /g