Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地将Vim中的一组行与另一组行连接起来?_Vim - Fatal编程技术网

如何有效地将Vim中的一组行与另一组行连接起来?

如何有效地将Vim中的一组行与另一组行连接起来?,vim,Vim,比如说,我有10个连续的行,后面跟着另外10行,例如: 1 2 ⋮ 10 a b ⋮ j 我想将第二个范围(a..j)中的行附加到第一个范围(1..10)中的行,以便将上述20行改为以下10行: 1a 2b ⋮ 10j 我可以使用哪些Vim命令来实现这一点?我将开始使用a,然后按CTRL-V、10j$d以块方式删除所有内容 然后:设置virtualedit=all,转到第一行,将光标向右移动10个字符,然后按p。现在删除十行中的第一个空格序列 还有第二种方法,基本相同: 10日 :调用se

比如说,我有10个连续的行,后面跟着另外10行,例如:

1
2
⋮
10
a
b
⋮
j
我想将第二个范围(
a
..
j
)中的行附加到第一个范围(
1
..
10
)中的行,以便将上述20行改为以下10行:

1a
2b
⋮
10j

我可以使用哪些Vim命令来实现这一点?

我将开始使用
a
,然后按CTRL-V、
10j$d
以块方式删除所有内容

然后
:设置virtualedit=all
,转到第一行,将光标向右移动10个字符,然后按p。现在删除十行中的第一个空格序列

还有第二种方法,基本相同:

  • 10日
  • :调用setreg(“”、@“、”
    ^V
    其中^V是用CTRL-V CTRL-V键入的
    (这将以块方式打开寄存器)
  • P
  • :,+10s///g
您也可以通过编程实现:使用Q进入Ex模式,然后键入

 let i = 1
 while i <= 10
    call setline(i, getline(i) . getline(11))
    11d
    let i = i + 1
 endwhile
 vi
其中1是第一行,10是行数。因此,您需要20行。

这将是我的方式:

qaG"aDdd9-$"apq
9@a
说明:

q             # Begin recording typed characters...
a             # to register 'a'
G             # Set cursor in last line.
"aD           # Delete the content from the beginning of line till the end and save it in register 'a'.
dd            # Previous command deleted the content but left the line in blank, delete the complete line.
9-            # Go back 9 lines.
$             # Set cursor at the end of current line (last number in your example).
"ap           # Paste content of register 'a' (at end of line without newline character).
q             # Stop recording.
---------------
9             # Run nine times.
@a            # Commands of register 'a' (all previous commmands).
  • 记录命令的寄存器“a”是保存每行内容的不同寄存器,尽管它们的名称相同(字母“a”)

1.假设光标位于 二十行块,让我们考虑以下简短的EX命令:

:,+9g/^/''+10m.|-j!
这是在属于的行上运行的
:global
命令 接下来十行的范围(从当前行开始)。每 在这些行中,有两个Ex命令,
''+10m.
-j,按顺序排列
执行。第一个命令取第行下的第十行
光标已定位并将其插入到
使用
:move
命令,光标当前所在的行。
:join
命令,
-j,将刚移动的行附加到
就在它上面(不插入或删除中间的空白,
由于
修改器)

有两个考虑因素是必要考虑的 为了了解那条线的运动。首先,在命令之前 在另一行(光标)上执行
:global
中指定的 位于该行的第一列。这边是地址 在上述
:move
命令中引用为
,对应 到当前正在其上运行命令的最新行。 第二,前一行的当前行数 一个
:global
命令被发送到执行,并被添加到跳转列表中。 因此,它的地址可以通过
伪标记(请参见
:帮助:范围

另见问题“”

2.通过正常模式命令可以实现相同的效果:

qqdd9+PgJ9-q9@q
此命令序列使用 宏以重复单行传输操作。命令 连接第一对行,
dd9+PgJ9-
,记录在 使用
q
命令注册q
。与Ex命令类似 如上所述,宏删除当前行(
dd
),移动 光标向下移动九行(
9+
),将刚剪切的线插入到 新的光标位置(
P
),将两行连接起来,而不添加或 删除它们之间的任何空格(
gJ
),并将光标移动九次 向上(
9-
)行。最后,这些操作将自动迭代 九次使用
@
命令连接其余九对
相应的行。

由于您的建议之一是更改寄存器类型,我认为应该提到Ingo Karkat的无条件粘贴插件。因为它通过一个相当不错的映射
gbP
。这是一个多么过度的工程!这是一项工作,甚至比调用
setreg()
PasteLines()都要短
命令中的
:g
标记的作用是什么?(你能带我到相关的帮助部分吗?我似乎已经找到了它,但找不到)@Benoit:The
伪标记在这里与其他地方的含义相同。请参见上面的解释和
:help:range
:help“”
:help jumplist
。另请参见关于此问题的泛化的问题:“”。
:,+9g/^/''+10m.|-j!
qqdd9+PgJ9-q9@q