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


78

是否有命令删除当前行正下方的一行(或几行)?目前,我的操作是: jdd然后.根据需要重复。是否有将所有这些结合在一起的命令?

更新:我想拥有这样的命令的原因是,我不想离开当前位置,但是能够删除下面的行。


我认为@Peter Rincker的答案应标记为答案
gixxer

@gixxer完成了,谢谢大家的注意
Valentin Vasilyev

Answers:


159

delete ex命令将很好地工作。

:+,$d

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

要删除接下来的2行,请遵循以下范围,+1,+2或者简称+,+2

:+,+2d

如@ib所述,:deleteor:d命令将光标移至已删除文本旁边的行首。(即使已nostartofline设置)。为了克服这个问题,我们可以发出``普通模式命令。``会跳回到最后一次跳转之前的确切位置,在这种情况下为:d命令。现在我们的命令

:+,+2denter``

或者作为一个命令

:+,+2d|norm! ``

为了简化操作,我们将所有内容包装在一个命令中:

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

现在删除下面的三行:

:3D

该命令还可以采取{reg}:delete:yank做。因此,将接下来的4行删除到寄存器a中将是:

:4D a

想要查询更多的信息

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

3
请注意,这是一个非常简单的解决方案,可以“即开即用”地工作,并且可以推广到其他命令(例如,:+1,+5s!a!b!g在光标后的第4行将a替换为b)。有关更多示例,请参见:help命令范围。
David Winslow'9

如果不移动光标,那么这种简单的解决方案将非常有用。至少,该命令应类似于:+,$d|norm!``。顺便说一句,如问题所述,问题的作者希望删除当前行下方的几行,而不必一直删除到文件末尾。
ib。

@ib:对范围进行更详细的说明会改善答案吗?也许set sol吧?如何使用`商标?
彼得·林克

@Peter:可能是这样。顺便说一句,sol单独关闭并不能解决问题:当使用删除三:+,+3d行时,光标将移动到已删除行的下一行。
ib。

@ib:我已将您的建议纳入我的答案。感谢您的反馈意见。
彼得·林克


29

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

jdG

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


2
并且也会删除每一行,直到缓冲区的末尾。
ib。

我看错了原始问题,对不起。以为OP希望删除当前行以下的所有行。更改了我的帖子。
ClosedID 2010年

7

好吧,要做到这一点,您可以简单地使用xxdd命令。大多数时候,我知道(至少有一个主意)我正在编辑的脚本的大小。因此,以下命令通常绰绰有余:

  • 99dd
  • 999dd删除从光标位置开始的999行。
  • 9999dd
  • 99999dd用于非常长的脚本;)

4

其他解决方案提供了很多信息,但是我觉得使用宏对此会更简单:

qq (开始录制)

jddk (继续,删除该行,然后再返回-即您要执行的操作)

q (结束录制)

现在,您可以@q执行此操作,将光标保持在当前位置。您还可以执行一些操作,例如5@q删除光标下方的5行。

最后,如果您要重复执行一次以上的操作,则可以@@在第一次运行后键入内容@q(这将重复最后一次使用的宏-在这种情况下q


2

这是商标工作!

尝试 maj20dd`a

ma设置文件专用标记“ a”,进行j20dd所需的删除(在这种情况下为20行),然后`a将您恢复到标记的位置(行和列)。

显然,可以将这种模式扩展为可以做任何您想返回的标记。如果使用mA(或其他大写字母)标记,则该标记实际上在文件中将是唯一的,因此您甚至可以在返回之前在其他位置进行编辑。如果使用频率很高,可以按照上面的建议将其设置为宏。


1

您可以输入要删除的行数: j 20 dd k


Finalk将光标移到初始行上方。另外,由于会丢失光标列的位置dd
ib。

@ib:在我的测试中不是。您实际尝试过吗?注意首字母j
Paul Ruane 2010年

抱歉,我的第一点是错误的(尝试执行命令时,我没有注意到指定的计数(在您的示例中为“ 20”)大于行数,直到结束为止。缓冲)。但是第二个仍然存在:游标的列位置在之后发生变化dd(我相信已删除行旁边的行的第一个非空白字符)。
ib。

@ib:是的,我同意更改列的位置。
Paul Ruane 2010年

请对您的答案进行微不足道的修改,因此我可以对其进行投票。我认为您的回答毕竟不应该被否定。
ib。

-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 命令的映射 。


例如,要映射到逗号,d(按d,然后按d),插入以下几行(在通过@ib输入上述答案后):1:let mapleader = ","2:nmap <leader>d :D<CR>
Kevin Lee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.