我经常在本地编辑文件,然后将其剪切并粘贴到 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
在任何情况下,都不应使用奇怪的数字作为范围。