如何使用 vim 在 V 线模式下移动/移动几行.行间距为 2 行

  • 本文关键字:移动 几行 vim 何使用 模式 vim
  • 更新时间 :
  • 英文 :


例如,我想在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>
    

最新更新