假设我们在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
读到你的答案的底部,意识到你不是在寻找一个变通方法…我不知道为什么不工作