繁体   English   中英

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

[英]How to move/shift around several rows in V-line mode using vim. Lines are 2 rows apart

例如,我想在 B28 行中使用 Shift + v 以 B28、B29 和 B30 开头的 select 行,然后在 B29 行中使用 select 等等...,然后按“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  

视觉模式只能 select 连续区域(这适用于按字符、按行和按块视觉模式,无论virtualedit的值如何)。 唯一的例外是带有vip$的参差不齐的行尾。

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

:global/^B\d+/move /ROW 1/-

应该将所有以B开头的行,后跟数字移动到ROW 1之后的行。 (它们可能会被颠倒;在你的情况下,一个简单的:sort n可能会做,但通常:[range]!tac:[range]global/./move <firstline>可以颠倒行。)

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

  • 标记插入点:: :/ROW 1/mark a
  • 在寄存器q中启动递归宏: qqqq (前三个清除寄存器)
  • go 到下一次移动/^B\d+
  • 移动它dd'ap
  • 调整标记ma
  • 递归调用@q
  • q

现在点击@q并观看魔术。

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

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

:g/^B/normal! dd1G}P
  • :g/^B/<cmd> > 在以B开头的每一行上执行<cmd>
  • normal! <macro> normal! <macro>执行普通模式宏<macro>
  • dd将行剪切到未命名的寄存器,
  • 1G将 cursor 移动到第 1 行,
  • }将 cursor 移动到当前段落之后的空行,这是关键,因为它允许我们将下一行放在最后一行的下方,从而尊重顺序,
  • P将未命名寄存器的内容放在当前行的上方。

参考:

:help :global
:help :normal
:help /^
:help dd
:help G
:help }
:help P

- - 编辑 - -

有很多方法可以解决您的目标,即使它不在第一行。

  • 带行号:

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

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

     :g/^B/normal? dd?ROW1^M}P " ^M is obtained with <Cv><CR>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM