2010-09-02 43 views
50

是否有删除当前行下方一行(或几行)的命令? 目前我在做: jdd然后根据需要重复。 有没有可以将所有这些结合起来的命令?如何在vim中删除当前行下面的行?

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

+0

我认为@Peter Rincker的答案应该被标记为答案 – gixxer 2017-01-13 01:44:16

+0

done @gixxer,谢谢你的支持 – Valentin 2017-01-13 16:42:47

回答

115

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}:delete:yank呢。所以删除接下来的4号线到寄存器a是:

:4D a 

欲了解更多信息

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

请注意,这是一个相当简单的解决方案,可以“开箱即用”,并且可以推广到其他命令(例如,':+ 1,+ 5s!a!b!g'将用4行中的b代替a's在游标之后)。有关更多示例,请参阅:help command-ranges。 – 2010-09-03 01:06:35

+0

这个简单的解决方案会很棒,只要它不移动光标。至少,该命令应该看起来像':+,$ d | norm!\''''。顺便说一下,如问题中所述,问题的作者想要删除当前文件下面的几行,而不一定是一直到文件末尾。 – 2011-10-22 01:39:38

+0

@ib:答案可以通过更详细的范围解释来改善吗?也许'设置sol'?如何使用''''标记? – 2011-10-22 02:09:05

0

可以定义一个小功能,做你描述的正是: 删除下一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,如果有必要 。

+0

未经测试,但接受为答复,谢谢。 – Valentin 2010-09-02 10:58:31

+0

例如,要映射到逗号,d(按','后跟d)插入以下行(在通过@ib输入以上答案之后) 1:'let mapleader =“,”' 2:'nmap d:D ' – 2012-12-07 04:11:46

2

您可以输入行数删除:Ĵ ddķ

+0

最后'k'将光标移动到最初的行上方。此外,由于“dd”,光标列位置将丢失。 – 2010-09-02 09:08:36

+0

@ib:不是在我的测试中没有。你真的尝试过了吗?注意最初的** j **。 – 2010-09-02 09:24:52

+0

对不起,我的第一个观点是错误的(当我试过这个命令时,我没有注意到我指定的计数(在你的例子中是'20')大于直到结束时的行数缓冲区)。但第二个仍然存在:光标的列位置在dd之后发生变化(我相信在删除行旁边的第一个非空白字符处)。 – 2010-09-02 09:34:53

25

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

jdG 

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

+2

并且会删除每一行直到缓冲区结束。 – 2010-09-02 10:42:55

+0

我误解了原来的问题,对不起。认为OP想要删除当前下面的所有行。改变了我的帖子。 – ClosedID 2010-09-02 11:13:49

+0

应该是公认的答案! – 2016-09-06 13:41:06

3

这是标记的工作!

尝试maj20dd`a

ma设置特定文件标记“A”,j20dd你想要做删除(20线在这种情况下),并`a恢复你标记的位置(行和列)。

显然这种模式可以扩展到做任何你想要的东西,然后再回到标记。如果您使用mA(或任何其他大写字母),则该标记在文件中实际上是唯一的,所以您甚至可以在返回之前编辑其他地方。如果你有非常频繁的使用情况,你可以按照上面的建议把它变成一个宏。

5

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

qq(开始记录)

jddk(下去,删掉就行了,回去了 - 即次荷兰国际集团你想要做的)

q(结束录音)

现在你可以做@q执行此操作,保持光标在当前位置。您也可以执行诸如[email protected]之类的操作来删除光标下方的5行。

最后,如果你重复动作一次以上,你可能只是第一次运行@q(此重复上次使用的宏 - 在这种情况下q)后键入@@

6

得好,只要你可以使用xxdd命令即可。大多数时候我知道(至少有一个想法)我正在编辑的脚本的大小。因此,这个命令如下通常绰绰有余:

  • 99dd
  • 999dd以除去起始光标位置处999lines。
  • 9999dd
  • 99999dd很长时间的脚本;)
48

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

+0

这是正确的答案。 – Gaurav 2016-09-01 08:20:41