:g / ^ / normおよび:%normによるラインリファレンスの違いの理解


8

次の非常に単純なファイルがあるとしましょう

a
b
c
d
e

そして、各行の後に空行を追加することにしました。いくつかの異なる方法がすぐに思い浮かびます。私たちはそれをするだけかもしれません(したがって、失敗を受け入れます)。のようなマクロを記録し、qqo<ESC>jqそれを数回繰り返す場合があります。

当時、私には他の2つの方法がより明白に思えました。

まず、:normコマンドoを各行に発行すると思いました。だから私は走る:%norm o。しかし、実際に何が起こるかというと、5行の空白行があり、その後に上記の分離されていない行が続きます。私はこれを%norm、vimが実際にこの5行のファイルの最初の5行で次の通常のコマンドを発行してメッセージを取得することを意味すると解釈しますoコマンドは、新しい行を作成し、vimのは、それはいくつかの他の識別子によって、実際に行番号で参照していないという意味で「ダム」です。

さて、恥ずかしかったです。承知しました。上記の方法が機能するかどうかを確認するために、他にもいくつか試してみましたが、残念ながらできませんでした。好奇心から、私は他のお気に入りの大量適用方法を試しました。これは私を試してみました:g/^/norm o。驚いたことに、これはうまくいきます!だから私の目には、vimは上記と同じようにここでは「ダム」ではなく、単に行番号だけではなく行を参照しているようです。

正確には何が起こっているのですか?


2
余談ですが、次のようにすることもできます::%s/$/\r/、または次のようにします::%s/\n/\r\r/。要点は、改行をと一致させることができるが、置換値の\nように記述する必要があることです\r
lcd047

回答:


9

まあ、の%省略形です1,$(最初の行から最後の範囲まで)。から:he :%

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

そしてのために:global

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

したがって、最初のケースはリストを変更しながらトラバースするようなものなので、リスト要素のカウンターは無効になります。2番目のケースでは、ターゲットにする要素を1つのパスでマークします。これにより、2番目のパスでリストが変更された場合でも、どの要素に取り組むかがわかります。


ああ、それはグローバルのヘルプファイルにもあります。なんてばかげている。ありがとう
davidlowryduda 2015

男- g はやりすぎ狂った便利です。平均的なviユーザーからパワーユーザーに移行するのにもっと時間を費やさなければならない
javadba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.