[英]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
(前三个清除寄存器)/^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.