如何使用vim在V线模式下移动/移动几行。两行相隔两行

如何使用vim在V线模式下移动/移动几行。两行相隔两行,vim,Vim,例如,我想在B28行中使用Shift+v选择以B28、B29和B30开头的行,然后选择B29行,依此类推,然后按“d”,然后移动到第1行,在第一行中按“Shift-p”将所有这些行粘贴到那里 ROW 1 A26 51.00824 D26 35.94841 D27 35.94841 B28 7.07486 A28 35.95497 D28 179.99932 B29 4.15400

例如,我想在B28行中使用Shift+v选择以B28、B29和B30开头的行,然后选择B29行,依此类推,然后按“d”,然后移动到第1行,在第一行中按“Shift-p”将所有这些行粘贴到那里

ROW 1 

A26       51.00824   
D26       35.94841  
D27       35.94841  
B28        7.07486  
A28       35.95497  
D28      179.99932  
B29        4.15400  
A29       90.00068  
D29      179.99932  
B30        7.07490  
视觉模式只能选择连续区域(这适用于字符、行和块视觉模式,而与
virtualedit
的值无关)。唯一的例外是不规则的行尾,比如说,
vip$

但你可以通过其他方式实现你的目标。例如:

:global/^B\d+/move /ROW 1/-
应将所有以
B
开头的行以及后面的数字移动到
第1行之后的行。(它们可能会反转;在您的情况下,可能会执行简单的
:sort n
,但通常
:[range]!tac
:[range]global//move
可以反转行。)

或者,您可以这样录制宏:

  • 标记插入点:
    :/ROW 1/标记a
  • 在寄存器
    q
    中启动递归宏:
    qqq
    (前三个清除寄存器)
  • 转到下一个事件以移动
    /^B\d+
  • 移动它
    dd'ap
  • 调整标记
    ma
  • 递归调用
    @q
  • fini
    q
现在点击
@q
观看魔术

如果您需要为不同的事情重复上述多次,我将编写一系列命令使其工作一次,然后将其转换为一个函数并概括可变的事情。瞧,自动化。

视觉模式只能选择连续区域(这适用于字符、行和块视觉模式,而不管
virtualedit
的值如何)。唯一的例外是不规则的行尾,比如说,
vip$

但你可以通过其他方式实现你的目标。例如:

:global/^B\d+/move /ROW 1/-
应将所有以
B
开头的行以及后面的数字移动到
第1行之后的行。(它们可能会反转;在您的情况下,可能会执行简单的
:sort n
,但通常
:[range]!tac
:[range]global//move
可以反转行。)

或者,您可以这样录制宏:

  • 标记插入点:
    :/ROW 1/标记a
  • 在寄存器
    q
    中启动递归宏:
    qqq
    (前三个清除寄存器)
  • 转到下一个事件以移动
    /^B\d+
  • 移动它
    dd'ap
  • 调整标记
    ma
  • 递归调用
    @q
  • fini
    q
现在点击
@q
观看魔术


如果您需要为不同的事情重复上述多次,我将编写一系列命令使其工作一次,然后将其转换为一个函数并概括可变的事情。瞧,自动化。

另一种方法,只是为了好玩:

:g/^B/normal! dd1G}P
  • :g/^B/
    对以a
    B
    开头的每一行执行
  • 正常执行正常模式宏
  • dd
    将行剪切到未命名寄存器
  • 1G
    将光标移动到第1行
  • }
    将光标移动到当前段落后的空行,这是关键,因为它允许我们将下一行放在最后一行的下方,从而尊重顺序
  • P
    将未命名寄存器的内容置于当前行上方
参考:

:help :global
:help :normal
:help /^
:help dd
:help G
:help }
:help P
---编辑---

有很多方法可以实现您的目标,即使它不在第1行

  • 使用行号:

    :g/^B/normal! dd23G}P
    
  • 带有标记:

    ma
    :g/^B/normal! dd'a}P
    
  • 通过搜索:

    :g/^B/normal! dd?ROW1^M}P    " ^M is obtained with <C-v><CR>
    
    :g/^B/正常!dd?ROW1^M}P“^M是用
    

另一种方法,只是为了好玩:

:g/^B/normal! dd1G}P
  • :g/^B/
    对以a
    B
    开头的每一行执行
  • 正常!
    执行正常模式宏
  • dd
    将行剪切到未命名寄存器
  • 1G
    将光标移动到第1行
  • }
    将光标移动到当前段落后的空行,这是关键,因为它允许我们将下一行放在最后一行的下方,从而尊重顺序
  • P
    将未命名寄存器的内容置于当前行上方
参考:

:help :global
:help :normal
:help /^
:help dd
:help G
:help }
:help P
---编辑---

有很多方法可以实现您的目标,即使它不在第1行

  • 使用行号:

    :g/^B/normal! dd23G}P
    
  • 带有标记:

    ma
    :g/^B/normal! dd'a}P
    
  • 通过搜索:

    :g/^B/normal! dd?ROW1^M}P    " ^M is obtained with <C-v><CR>
    
    :g/^B/normal!dd?第1行^M}P“^M是用
    

这个解决方案非常有效,知道“第1行”匹配的行号(如果它在文件中的不同位置而不是开头),您可以用
1G
代替行号
G
并将行粘贴到那里。这个解决方案非常有效,知道“第1行”匹配的行号(如果它在文件中的不同位置,而不是文件的开头)您可以用
1G
替换行号
G
,并将行粘贴到那里。我尝试过
…move/ROW 1/;'}
但这不起作用,出于某些原因,我尝试过
…move/ROW 1/;'}
但由于某些原因,这不起作用