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

zpjtge22  于 2023-03-30  发布在  其他
关注(0)|答案(9)|浏览(176)

有没有一个命令可以删除当前行下面的一行(或几行)?目前我正在做的是:jdd然后.根据需要重复。有没有一个命令可以合并所有这些命令?
更新:我想有这样的命令的原因是,我不喜欢从当前位置移动,但能够删除下面的行。

djp7away

djp7away1#

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

:+,$d

这将删除从current +1到end($)的所有行
要删除接下来的两行,可以使用以下范围,+1,+2或简写+,+2

:+,+2d

正如@ib所提到的,:delete:d命令会将光标移动到被删除文本旁边的行的开头。(即使设置了nostartofline)。为了克服这个问题,我们可以发出正常模式命令。将跳回到上次跳转之前的确切位置,在本例中是:d命令。我们的命令现在是
:+,+2denter``
或作为一个前命令

:+,+2d|norm! ``

为了让这一切变得更简单,我们将所有这些都包含在一个命令中:

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

现在删除下面3行:

:3D

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

:4D a

更多信息

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

vfwfrxfs2#

dG应该可以工作。
这意味着从当前游标删除所有行,直到文件结束。

o2gm4chl

o2gm4chl3#

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

jdG

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

r1zk6ea1

r1zk6ea14#

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

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

ecr0jaav5#

其他的解决方案都很有用,但我觉得使用宏更简单:
qq(开始录制)
jddk(向下,删除行,然后向上返回-即您想要做的事情)
q(结束录制)
现在你可以执行@q来执行这个操作,将光标保持在当前位置。你也可以执行类似5@q的操作来删除光标下面的5行。
最后,如果您要多次重复该操作,则可以在第一次运行@q后键入@@(这将重复上次使用的宏-在本例中为q

uqxowvwt

uqxowvwt6#

这是马克斯的工作!
尝试maj20ddama设置特定于文件的标记'a',j20dd执行您想要的删除(本例中为20行),``a将您恢复到标记的位置(行和列)。
显然,这个模式可以扩展到在返回标记之前做任何你想做的事情。如果你使用mA(或任何其他大写字母),标记实际上在文件中是唯一的,所以你甚至可以在返回之前在其他地方编辑。如果你有一个非常频繁的使用,你可以按照上面的建议将它设置为宏。

i34xakig

i34xakig7#

您可以输入要删除的行数:j20ddk。

ia2d9nvy

ia2d9nvy8#

您还可以用途:Shift + V、Shift + G和Shift + X

nkcskrwz

nkcskrwz9#

只是为了好玩,你可以定义一个小函数来完成你所描述的:删除当前行下面的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

此外,还可以定义一个命令,接受要删除的行数(如果省略,则为1)和寄存器名称,并将其用作可选参数(就像:delete命令一样)。

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

此外,如果需要,您可以定义一个Map来触发上面的:D命令。

相关问题