使用垂直选择VIM添加新行

时间:2014-03-24 14:19:43

标签: 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 。我希望扩展所有块。没啥事儿。为什么呢?

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

4 个答案:

答案 0 :(得分:6)

Ctrl + V 不是"垂直选择",它是" blockwise-visual"。顾名思义,它是用于选择"块" (矩形)文字。

如果在所选块中插入换行符,则会破坏其下方的所有内容。结果是,Vim不再有意义的方式将更改应用于块的其余部分,因为它不清楚什么"其余的"已经了。

答案 1 :(得分:0)

我要做的是为行范围应用:substitution,例如通过视觉模式解决这些问题:

:'<,'>s/{}$/{\r\r}/

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

答案 2 :(得分:0)

就像Max所说,输入无法插入blockwise-visual vim模式,文档说:

视觉块更改(v_b_c):块中的所有选定文本将替换为相同的文本字符串。使用&#34; c&#34;删除所选文本并启动插入模式。那你可以 输入文字(没有换行符)。当你点击时,相同的字符串是 插入所有先前选定的行。

我找到的最佳解决方法是:

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

      

    CTRL Vjjj

  • 插入一些在操作的文本块中唯一的标记,例如使用标记&#34; NEWL &#34;:

      

    INEWL ESC

  • 对块进行行选择,例如:

      

    Vjjj

  • 替换刚用换行符插入的标记( ctrl v 输入 - &gt; ^ M),例如:< / p>

      

    :S / NEWL / CTRL v 输入 /克

答案 3 :(得分:-1)

尝试使用sed:

:%!sed 's/}/\n\n}/g

阅读你答案的底部并意识到你没有找到一个解决方法......我不确定它为什么不起作用。