如果行数 > 文件长度,则在 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

在任何情况下,都不应使用奇怪的数字作为范围。

相关内容