使用垂直选择VIM添加新行



假设我们在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。然后输入(插入模式):

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

然后按Esc。我期望扩展所有的块。什么也没有发生。为什么?

我知道一个简单的替换或一个宏将拯救我。我知道有其他选择,但我想知道为什么在使用垂直选择时不添加新行

Ctrl+V不是"垂直选择",而是"块显示"。顾名思义,它用于选择文本的"块"(矩形)。

如果你在选定的块中插入换行符,它会打乱它下面的所有内容。结果是,Vim不再有一种有意义的方式将更改应用到块的其余部分,因为它不清楚"其余部分"是什么了。

就像Max说的,在块视觉vim模式下不能插入enter,文档说:

Visual-block change (v_b_c):块中的所有选定文本将被相同的文本字符串替换。当使用"c"时,所选文本将被删除并启动插入模式。然后你就可以输入text (不换行)。当你点击时,同样的字符串是

我发现最好的解决方法是:

  • 按位选择要插入换行符的列,例如列1x3:

    ctrl Vjjj

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

    INEWL esc

  • 执行代码块的行选择,例如:

    Vjjj

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

    : s/NEWL/ ctrl v 输入/g

我要做的是为行范围应用:substitution,例如通过视觉模式寻址它们:

:'<,'>s/{}$/{rr}/

正如Max已经回答的那样,视觉块插入只有在您不通过插入额外的行(或在编辑时四处移动)破坏块的布局时才有效。

尝试使用sed:

:%!sed 's/}/nn}/g

读到你的答案的底部,意识到你不是在寻找一个变通方法…我不知道为什么不工作

最新更新