有没有一个命令可以删除当前行下面的一行(或几行)?目前我正在做的是:jdd然后.根据需要重复。有没有一个命令可以合并所有这些命令?更新:我想有这样的命令的原因是,我不喜欢从当前位置移动,但能够删除下面的行。
djp7away1#
delete ex命令可以很好地工作。
:+,$d
这将删除从current +1到end($)的所有行要删除接下来的两行,可以使用以下范围,+1,+2或简写+,+2
+1,+2
+,+2
:+,+2d
正如@ib所提到的,:delete或:d命令会将光标移动到被删除文本旁边的行的开头。(即使设置了nostartofline)。为了克服这个问题,我们可以发出正常模式命令。将跳回到上次跳转之前的确切位置,在本例中是:d命令。我们的命令现在是:+,+2denter``或作为一个前命令
:delete
:d
nostartofline
正常模式命令。
:+,+2d|norm! ``
为了让这一切变得更简单,我们将所有这些都包含在一个命令中:
command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``
现在删除下面3行:
:3D
此命令也可以像:delete和:yank一样接受{reg}。因此,将接下来的4行删除到寄存器a中将是:
:yank
{reg}
a
:4D a
更多信息
:h :d :h :command :h :command-register :h :command-count :h ``
vfwfrxfs2#
dG应该可以工作。这意味着从当前游标删除所有行,直到文件结束。
o2gm4chl3#
这将删除当前行下面的所有行:
jdG
不幸的是,这将在删除后将光标移动到当前行的开头。
r1zk6ea14#
好吧,要简单地做到这一点,你可以使用xxdd命令。大多数时候我知道(至少有一个想法)我正在编辑的脚本的大小。所以,下面的命令通常是绰绰有余:
ecr0jaav5#
其他的解决方案都很有用,但我觉得使用宏更简单:qq(开始录制)jddk(向下,删除行,然后向上返回-即您想要做的事情)q(结束录制)现在你可以执行@q来执行这个操作,将光标保持在当前位置。你也可以执行类似5@q的操作来删除光标下面的5行。最后,如果您要多次重复该操作,则可以在第一次运行@q后键入@@(这将重复上次使用的宏-在本例中为q)
qq
jddk
q
@q
5@q
@@
uqxowvwt6#
这是马克斯的工作!尝试maj20ddama设置特定于文件的标记'a',j20dd执行您想要的删除(本例中为20行),``a将您恢复到标记的位置(行和列)。显然,这个模式可以扩展到在返回标记之前做任何你想做的事情。如果你使用mA(或任何其他大写字母),标记实际上在文件中是唯一的,所以你甚至可以在返回之前在其他地方编辑。如果你有一个非常频繁的使用,你可以按照上面的建议将它设置为宏。
maj20dd
设置特定于文件的标记'a',
执行您想要的删除(本例中为20行),``a
mA
i34xakig7#
您可以输入要删除的行数:j20ddk。
ia2d9nvy8#
您还可以用途:Shift + V、Shift + G和Shift + X
nkcskrwz9#
只是为了好玩,你可以定义一个小函数来完成你所描述的:删除当前行下面的n行并恢复光标的初始位置。
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命令。
:D
9条答案
按热度按时间djp7away1#
delete ex命令可以很好地工作。
这将删除从current +1到end($)的所有行
要删除接下来的两行,可以使用以下范围,
+1,+2
或简写+,+2
正如@ib所提到的,
:delete
或:d
命令会将光标移动到被删除文本旁边的行的开头。(即使设置了nostartofline
)。为了克服这个问题,我们可以发出正常模式命令。
将跳回到上次跳转之前的确切位置,在本例中是:d
命令。我们的命令现在是:+,+2denter``
或作为一个前命令
为了让这一切变得更简单,我们将所有这些都包含在一个命令中:
现在删除下面3行:
此命令也可以像
:delete
和:yank
一样接受{reg}
。因此,将接下来的4行删除到寄存器a
中将是:更多信息
vfwfrxfs2#
dG应该可以工作。
这意味着从当前游标删除所有行,直到文件结束。
o2gm4chl3#
这将删除当前行下面的所有行:
不幸的是,这将在删除后将光标移动到当前行的开头。
r1zk6ea14#
好吧,要简单地做到这一点,你可以使用xxdd命令。大多数时候我知道(至少有一个想法)我正在编辑的脚本的大小。所以,下面的命令通常是绰绰有余:
ecr0jaav5#
其他的解决方案都很有用,但我觉得使用宏更简单:
qq
(开始录制)jddk
(向下,删除行,然后向上返回-即您想要做的事情)q
(结束录制)现在你可以执行
@q
来执行这个操作,将光标保持在当前位置。你也可以执行类似5@q
的操作来删除光标下面的5行。最后,如果您要多次重复该操作,则可以在第一次运行
@q
后键入@@
(这将重复上次使用的宏-在本例中为q
)uqxowvwt6#
这是马克斯的工作!
尝试
maj20dd
ama
设置特定于文件的标记'a',
j20dd执行您想要的删除(本例中为20行),``a
将您恢复到标记的位置(行和列)。显然,这个模式可以扩展到在返回标记之前做任何你想做的事情。如果你使用
mA
(或任何其他大写字母),标记实际上在文件中是唯一的,所以你甚至可以在返回之前在其他地方编辑。如果你有一个非常频繁的使用,你可以按照上面的建议将它设置为宏。i34xakig7#
您可以输入要删除的行数:j20ddk。
ia2d9nvy8#
您还可以用途:Shift + V、Shift + G和Shift + X
nkcskrwz9#
只是为了好玩,你可以定义一个小函数来完成你所描述的:删除当前行下面的
n
行并恢复光标的初始位置。此外,还可以定义一个命令,接受要删除的行数(如果省略,则为1)和寄存器名称,并将其用作可选参数(就像
:delete
命令一样)。此外,如果需要,您可以定义一个Map来触发上面的
:D
命令。