使用垂直选择VIM添加新行

4

假设我们在VIM中打开了以下文件内容:

function a1 {}
function a2 {}
function a3 {}
function a4 {}
function a5 {}
function a6 {}
function a7 {}

我希望以这种样式扩展所有功能:
function an {

}

为此,我尝试使用垂直选择(使用Ctrl + V):
function a1 {█
function a2 {█
function a3 {█
function a4 {█
function a5 {█
function a6 {█
function a7 {█

然后我按下了I。然后在插入模式下按下Enter

function a1 {
}
function a2 {}
function a3 {}
function a4 {}
function a5 {}
function a6 {}
function a7 {}

然后我按下了Esc键。我期望展开所有块,但什么也没发生。为什么?

我知道一个简单的替换或宏可以解决这个问题。我也知道有其他替代方案,但我想知道为什么在使用垂直选择时没有添加新行

4个回答

6

Ctrl+V不是“垂直选择”,而是“块状可视化”。正如其名称所示,它用于选择文本的“块”(矩形)。

如果在所选块内插入换行符,则会破坏下面的所有内容。结果是,Vim再也无法对剩余块应用更改,因为不再清楚“剩余部分”是什么。


1
像Max所说的,无法在块可视化vim模式中插入enter键,文档说明如下:
视觉块更改(v_b_c): 块中选择的所有文本将被替换为相同的文本字符串。当使用"c"时,选择的文本将被删除并启动插入模式。然后您可以输入文本(不带换行符)。当您按下Esc键时,相同的字符串将插入到以前选择的所有行中。
我发现最好的解决方法是:
  • 按位选择要插入换行符的列,例如1x3列:

    ctrlVjjj

  • 插入在文本块中唯一标记,例如使用标记 "NEWL":

    shiftINEWLesc

  • 进行文本块的行选择,例如:

    shiftVjjj

  • 用新行替换刚插入的标记 (ctrlventer -> ^M),例如:

    :s/NEWL/ctrlventer/g


0
我会对行范围应用一个:substitution,例如通过可视模式来寻址它们。
:'<,'>s/{}$/{\r\r}/

正如Max已经回答的那样,视觉块插入只在您在编辑时不插入其他行(或移动)而不破坏块的布局时才起作用。


-1
尝试使用sed: :%!sed 's /} / \n \n} / g' 阅读你的答案底部并意识到你不是在寻找解决方法...我不确定为什么它不起作用。

2
基本上你没有回答我的问题。我在问题的结尾写道,我知道有其他解决方案(如替换、宏等)来扩展块,但我想知道为什么这种方法不起作用。 - Ionică Bizău
读完你的回答后,意识到你不是在寻找解决方法...我不确定为什么它不起作用。 - acushner

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