如何删除vim中当前行下面的行?

时间:2010-09-02 06:40:43

标签: vim

是否有命令删除当前行正下方的一行(或几行)? 目前我这样做: j dd 然后根据需要重复。 是否有一个将所有这些结合起来的命令?

更新:我希望获得此类命令的原因是我不想离开当前位置,但能够删除下面的行。

8 个答案:

答案 0 :(得分:129)

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

:+,$d

这将删除当前+1到结尾($)

的所有行

要删除后两行,以下范围可行,+1,+2或速记+,+2

:+,+2d

正如@ib所提到的,:delete:d命令会将光标移动到已删除文本旁边的行的开头。 (即使设置了nostartofline)。为了解决这个问题,我们可以发出``普通模式命令。 ``将跳回到最后一次跳转之前的确切位置,在本例中为:d命令。我们现在的命令是

+ + 2 d 输入 ` `

或作为一个前命令

:+,+2d|norm! ``

为了使这更容易,我们将这一切包装在一个命令中:

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

现在删除以下3行:

:3D

此命令也可以{reg} :delete:yank一样。因此,将接下来的4行删除到寄存器a中将是:

:4D a

了解更多信息

:h :d
:h :command
:h :command-register
:h :command-count
:h ``

答案 1 :(得分:63)

d G 应该有效。
这意味着删除所有行,直到当前光标的文件末尾。

答案 2 :(得分:25)

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

jdG

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

答案 3 :(得分:7)

好吧,只需你可以使用xxdd命令。大多数时候我都知道(至少有一个想法)我正在编辑的脚本的大小。所以,下面的命令通常绰绰有余:

  • 99dd
  • 999dd从光标位置开始删除999行。
  • 9999dd
  • 99999dd for very long script;)

答案 4 :(得分:4)

其他解决方案是提供信息的,但我觉得使用宏更简单:

qq(开始录制)

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

q(结束录音)

现在你可以执行@q来执行此操作,将光标保持在当前位置。您还可以执行5@q之类的操作来删除光标下方的5行。

最后,如果你不止一次重复这个动作,你可以在第一次运行@@后输入@q(这会重复上一次使用的宏 - 在这种情况下q 1}})

答案 5 :(得分:2)

这是商标的工作!

尝试maj20dd`a

ma设置文件特定标记'a',j20dd执行您想要的删除(在这种情况下为20行),`a将您恢复到标记的位置(行和专栏)。

显然,在返回标记之前,可以将此模式扩展为执行任何操作。如果您使用mA(或任何其他大写字母),该标记实际上在文件中是唯一的,因此您甚至可以在返回之前在其他位置进行编辑。如果您经常使用,可以将其设为上面建议的宏。

答案 6 :(得分:1)

您可以输入要删除的行数: j 2 0 d d < / kbd> k

答案 7 :(得分:-1)

您可以定义一个完全符合您所描述内容的小功能: 删除当前行下面的下一行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的映射,如果是的话 必要的。