2010-09-02 76 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