例如,我想在B28行中使用Shift + v选择以B28,B29和B28开头的行,然后选择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/^Bd+/move /ROW 1/-
应将所有以B
开头,后跟数字的行移动到ROW 1
之后的行。(它们可能会被颠倒;在你的情况下,一个简单的:sort n
可能会做,但通常:[range]!tac
或:[range]global/./move <firstline>
可以反转线条。
或者,您可以录制如下宏:
- 标记插入点:
:/ROW 1/mark a
- 在寄存器
q
中启动递归宏:qqqq
(前三个清除寄存器) - 转到下一个匹配项以移动
/^Bd+
- 将其移
dd'ap
- 调整标记
ma
- 递归调用
@q
- 菲尼
q
现在点击@q
,观看魔术。
如果您需要为不同的事情多次重复上述内容,我会编写一系列命令来使其工作一次,然后将其转换为函数并概括可变的内容。瞧,自动化。
另一种方法,只是为了好玩:
:g/^B/normal! dd1G}P
:g/^B/<cmd>
在以B
开始的每一行上执行<cmd>
,normal! <macro>
执行正常模式宏<macro>
,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>