如果行數 > 檔案長度,則不接受在 Vi 中使用“dd”(刪除多行)

如果行數 > 檔案長度,則不接受在 Vi 中使用“dd”(刪除多行)

我經常在本地編輯文件,然後將其剪下並貼上到 vi 會話內的遠端 ssh 會話中。

第一步是透過執行類似的操作來刪除整個內容

 9999dd

這將刪除最多 9999 行的檔案。

現在,執行 14.04 LTS 的某個 ubuntu 機器上的 vi 版本的行為有所不同:如果檔案實際上不包含至少 9999 行,則不允許使用上述命令。

如何重新啟用先前/熟悉的行為 - 如果 N(在本例中為 9999)超過檔案行數,則整個檔案中的所有行都將被刪除?

更新 我很感謝您的答复選擇實現這一目標的方法。然而,這並不能解釋行為改變的原因/方式/時間(我已經成功使用 Ndd 多年。也許不是最佳方法。但它確實有效 - 包括在 ubuntu 上 - 各種版本,centos,os/x)。

另一個更新 前面的「:」被刪除:我們處於正常模式。它在這個特定的編輯器/vi 實例中仍然不起作用 - 而它可以與 99dd 一起工作(因為檔案有 > 99 行),並且在其他實例中也可以執行相同的操作 9999dd 。

答案1

@javadba,嘗試一下:set nocompatible

這兩種行為之間的差異似乎取決於我是否:set nocompatible在我的~/.vimrc/etc/vim/vimrc在全球的任何地方。

如果我:set nocompatible那麼我可以使用:9999而不是:$跳到小文件的底部,並且我可以擺脫諸如9999dd.如果我有不是 :set nocompatible然後當我嘗試時什麼也沒有發生,並且 當我嘗試跳到文件末尾時9999dd出現錯誤。E16: Invalid range:9999

答案2

您嘗試的操作(在命令模式下使用無效範圍)永遠不會起作用。它在 7.2.445 (Debian 6)、7.2.411 (CentOS 6.6)、7.3.429 (Ubuntu 12.04)、7.4.683 (Ubuntu 14.04、PPA) 中不起作用。

我認為您將其與 混淆了99999dd,後者在正常模式下有效,因為這裡的 N 不是行號,而是重複操作的次數 - 請注意缺少:

事實上,文檔也說了這麼多:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number

....
The {number} must be between 0 and the number of lines in the file.  When
using a 0 (zero) this is interpreted as a 1 by most commands.  Commands that
use it as a count do use it as a zero (:tag, :pop, etc).  Some commands
interpret the zero as "before the first line" (:read, search pattern, etc).

如果你想刪除所有行,並且想要使用命令模式來執行此操作,那麼:

:%d

或者,使用範圍:

:0,$d

如果您不想使用命令模式:

ggdG

在這兩種情況下,您都不應該使用奇怪的數字作為範圍。

相關內容