行数がファイルの長さより大きい場合、Vi で「dd」(複数行の削除) を使用することはできません。

行数がファイルの長さより大きい場合、Vi で「dd」(複数行の削除) を使用することはできません。

私はよく、ファイルをローカルで編集し、それを vi セッション内で切り取ってリモート ssh セッションに貼り付けます。

最初のステップは、次のようにしてコンテンツ全体を削除することです。

 9999dd

これにより、ファイルの最大 9999 行が削除されます。

現在、何らかの理由で、14.04 LTS を実行している特定の Ubuntu マシン上の vi のバージョンが異なって動作しています。ファイルに実際に少なくとも 9999 行が含まれていない場合、上記のコマンドは許可されません。

N (この場合は 9999) がファイルの行数を超えるとファイル全体のすべての行が消去されるという以前の /familiar の動作を再度有効にするにはどうすればよいでしょうか。

アップデート 回答を頂ければ幸いです代替これを実現する方法。ただし、動作がなぜ/どのように/いつ変更されたのかは説明されていません (私は長年 Ndd をうまく使用してきました。最適な方法ではないかもしれませんが、Ubuntu のさまざまなバージョン、CentOS、OS/X などでは動作します)。

もう一つのアップデート 先頭の「:」が削除されました。通常モードです。この特定のエディター/vi インスタンスでは、まだ機能しません。ただし、99dd では機能します (ファイルに 99 行以上あるため)。また、同じアクション 9999dd を実行すると、他のインスタンスでも機能します。

答え1

@javadba、試してみて:set nocompatible

これら 2 つの動作の違いは、グローバル動作が: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

どちらの場合も、範囲に奇妙な数字を使用しないでください。

関連情報