代码之家  ›  专栏  ›  技术社区  ›  Valentin V

如何删除VIM中当前行下方的行?

vim
  •  59
  • Valentin V  · 技术社区  · 14 年前

    是否有命令删除当前行正下方的行(或多行)? 目前我的做法是: J DD 然后 . 根据需要重复。 是否有一个命令可以组合所有这些内容?

    更新:我之所以希望有这样的命令,是因为我不想离开当前位置,但可以删除下面的行。

    8 回复  |  直到 6 年前
        1
  •  125
  •   Peter Rincker    13 年前

    delete ex命令可以很好地工作。

    :+,$d
    

    这将删除从当前+1到结尾($)的所有行

    要删除接下来的2行,以下范围将起作用, +1,+2 或速记 +,+2

    :+,+2d
    

    正如@ib提到的 :delete :d 命令将光标移动到已删除文本旁边的行的开头。(甚至) nostartofline 设置)。为了克服这一点,我们可以发布 `` 正常模式命令。 ` ` 将跳转回上次跳转之前的确切位置,在本例中, D 命令。我们的命令是

    : + , + D 进入 ` `

    或者作为一个前命令

    :+,+2d|norm! ``
    

    为了使这更容易,我们用一个命令来包装这一切:

    command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``
    

    现在删除以下3行:

    :3D
    

    此命令还可以 {reg} 喜欢 删除 :yank 做。所以删除寄存器中接下来的4行 a 将是:

    :4D a
    

    更多信息

    :h :d
    :h :command
    :h :command-register
    :h :command-count
    :h ``
    
        2
  •  61
  •   Filipp W. BlackMamba    6 年前

    D G 应该工作。
    这意味着从当前光标中删除文件结束之前的所有行。

        3
  •  25
  •   ClosedID    14 年前

    这将删除当前行下面的所有行:

    jdG
    

    不幸的是,删除后,会将光标移动到当前行的开头。

        4
  •  7
  •   xaa    10 年前

    好吧,简单地说,您可以使用xxdd命令。大多数时候我知道(至少有一个想法)我正在编辑的脚本的大小。因此,下面的命令通常就足够了:

    • 99 DD
    • 从光标位置开始删除9999行。
    • 99 99 DD
    • 99999 dd表示非常长的脚本;)
        5
  •  4
  •   mindthief    11 年前

    其他的解决方案是信息丰富的,但我觉得使用宏来实现这一点比较简单:

    qq (开始录制)

    jddk (向下,删除行,然后向上返回-即您要做的事情)

    q (结束录音)

    现在你可以做 @q 要执行此操作,请将光标保持在当前位置。你也可以做一些像 5@q 删除光标下的5行。

    最后,如果你重复这个动作不止一次,你可以输入 @@ 第一次跑步后 @ Q (这将重复上次使用的宏-在本例中 Q )

        6
  •  2
  •   Alex Feinman    14 年前

    这是马克的工作!

    尝试 maj20dd`a

    ma 设置文件特定标记“A”, j20dd 是否要删除(本例中为20行),以及 `a 将您恢复到标记的位置(行和列)。

    显然,在返回到标记之前,这个模式可以扩展为执行任何您想要的操作。如果你使用 mA (或任何其他大写字母)标记在文件中实际上是唯一的,因此您甚至可以在返回之前在其他地方进行编辑。如果你有一个非常频繁的使用,你可以使它成为一个宏如上所建议。

        7
  •  1
  •   Paul Ruane    14 年前

    可以输入要删除的行数: J D D K .

        8
  •  -1
  •   ib. Evgeny Shavlyugin    11 年前

    您可以定义一个执行您所描述的操作的小函数: 删除下一个 n 当前行下的行并还原为初始行 光标位置。

    function! DeleteNextLines(n, reg)
        let l = line('.')
        let m = min([a:n, line('$')-l])
        if m > 0
            let c = col('.')
            exe '+,+'.m 'd' a:reg
            call cursor(l, c)
        endif
    endfunction
    

    此外,还可以定义一个命令,该命令接受下面的行数 删除(默认为一个)和用作可选的寄存器名 争论(就像 :delete 命令)。

    :command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>)
    

    此外,您还可以为运行定义映射 :D 如果是 必要的。