2016-07-28 240 views
0

我知道如何在光标当前位置的上方或下方添加空行(使用oO),但是有没有一种快速方法可以在任意行号处添加空行?我意识到,在第一个空白行被添加后,我给出的原始行号将不再准确,例如,如果我想在第5行,第10行和第15行添加空行,那么在将第5行添加到空行后,第2行应该被添加到第11行,然后第三行应该被添加到行第17行。使用vim在指定的行号处快速添加空行?

编辑:我可以使用宏来完成此任务,即qaO<esc>q。但是,我必须仍然手动移动到单独的行号。

+1

只是一般说明:插入或删除相反顺序的行(最大行数第一个)不会将剩余插入/删除的行号搞砸。 – Kusalananda

+0

如果我经常这样做,我在shell中做,它会比vim容易得多。当然vim可以肯定的。 – Kent

回答

1

这里是在具体行号加空行,而不会影响其他线路的一般方式:

:g/^/if (index([5,10,15],line('.')) != -1)| s//\r/g |endif 

您可以添加或更改列表中[5,10,15](该index()函数内)的项目。这些项目是会受到影响的线路。

1

你只是得到append(lineno, string|list),它具有如下几个优点:它使光标独立(即它在哪里),它不会混淆任何寄存器(但是'[)。

:call map(reverse([5, 10, 15]), 'append(v:val, "")') 
1

,您仍然可以使用宏:

您的特定需求因此被解决。 假设你在第5行。如果你在下面插入一行,第10行变为11.因此,在插入新行后,向下移动五行,假定光标移动到新行。 (如果光标在第5行本身,则向下移动6行)

我们开始吧! 因此,请移至第5行。开始录制宏。 qaq来清除a注册。然后,按qa开始录制。按O创建新的线路。然后按Esc。通过按5j(或6j)(我不记得光标将在哪里),向下移动5(或6行)。

然后按@a以递归方式重播寄存器。按q结束注册。现在,按@a播放。这将递归地添加一个新行并向下移动5(或6)行,直到最后一行。

+2

我不明白这是如何做到这一点的宏,说我想要做的改变#1,2,3,5,8,13,21,34,55行....你如何移动宏观上的线? OP表示他不想手动将光标移动到目标行。 – Kent

+0

这对于“任意行数”不起作用。它仅适用于帖子中的特定示例。 – tnabdb

+0

@tnabdb我给斐波那契行号码;-) – Kent