如何加入 Vim 中的每一行?

Bol*_*wyn 31 vim normal-mode

我想加入很多(~1000)行,但只有下一个奇数。用手我可以做

Jj
Run Code Online (Sandbox Code Playgroud)

500 次就完成了。但是,如何在一个命令中执行这两个语句 500 次?打字

500Jj
Run Code Online (Sandbox Code Playgroud)

将加入接下来的 500 行,然后向下移动一行。

例子:

我有:

a
b
c
d
e
f
g
h
Run Code Online (Sandbox Code Playgroud)

我想要:

a b
c d
e f
g h
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试映射:

:map X Jj
500X
Run Code Online (Sandbox Code Playgroud)

但显然我应该再次阅读映射文档。不起作用。

aki*_*ira 33

我会这样做:

  1. 开始录制宏“q”: qqJjq

  2. 重放宏 'q' 500 次: 500@q

(实际上它不是一个名为“q”的宏,它是一个名为“q”的命名寄存器。而不是像 1. 那样以交互方式填充该寄存器,你也可以先做:let @q = "Jj"然后再做 2。)


Kev*_*nko 29

要在文件的每一行执行此操作:

:%normal J
Run Code Online (Sandbox Code Playgroud)

或者,更短:

:%norm J
Run Code Online (Sandbox Code Playgroud)

要仅对文件的一部分执行此操作,请选择带有V或以其他方式获取范围的行:

:'<,'>global/^/normal J
Run Code Online (Sandbox Code Playgroud)

或者,更短:

:'<,'>g/^/norm J
Run Code Online (Sandbox Code Playgroud)

  • 只是一个猜测——它按顺序执行每一行的命令,在执行完第一行之后,第二行现在消失了(已经与第一行合并了),所以它被迫移动到第三行。 (3认同)
  • 这确实会加入每两行。尝试一下! (2认同)

小智 15

那这个呢:

:g/$/j  
Run Code Online (Sandbox Code Playgroud)

或者

:g/$/j!  
Run Code Online (Sandbox Code Playgroud)

并每三行分组

:g/$/j3 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的解决方案,米罗。更好的是,您也可以在标准 vi 中使用它,尽管奇怪的是,当您在 SVR4.0 vi 中使用尾随数字(如在 Solaris 上)而不是 j3 时,它会生成 3 列,它会生成 4 列。(因此您需要使用j2 用于每 3 行分组) (2认同)