Vim:sは、1行の最初のN < gエントリを置き換えます。

Vim:sは、1行の最初のN < gエントリを置き換えます。

vimでは、時々1行で一致するものの最初のいくつかを置き換えますが、誰もがそれを好むわけではありませんg。たとえば、

a a a a a

到着

b b b a a

私はそれが利用可能であることを知っていますが、:s/a/b/[enter]:[up][enter]:[up][enter]それを3回繰り返すのは十分に退屈であり、私の行に10以上の置換があるかもしれません。
私は試した:

  • :s/a/b/3g:vim は末尾の文字について文句を言います。
  • :s/a/b/3:この行と次の2行の最初の項目を変更します。
  • 3:s/a/b:従来と同じです。
  • :s/a/b/g3:この行と次の2行に表示されるすべての内容を変更します。
  • :3s/a/b:3行目の最初の項目を変更します。
  • :/a/,3/a/s/a/b:ファイルに含まれる次の行と3行目aの間の各行の最初の発生を変更します(必要に応じてプロンプトを反転)。a
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/:この行と3つの行を含む次の行の間の各行の最初の出現を変更しますa(これは複数文字の検索に簡単には展開されません)。

さまざまなアドレッシングモードがありますが、動作しません。:sこの質問に対する答えを見つけようと、このコマンドについてかなり学んだが、まだ解決していないと言いたいと思います。

これを行う方法を知っている人はいますか?

(2回目から4回目の発生など、特定の範囲のボーナスポイント)

ベストアンサー1

確立された:s/pattern/replacement/gc サムスの考え_(代替文字列にパターンが含まれているときに正しい動作を保証する最も簡単な方法のようです。)2番目から4番目の項目まで1行に置き換えます。

:call feedkeys("nyyyq") | s/pat/string/gc

feedkeys()入力文字列をキーボード入力キューに埋める関数です。重要なことは、計算を事前に誤って覚えたり、妨げられる心配がないようにすることです。

より一般的なケースでは渡すN番目1行に表示される回数は次のとおりです。窒素非常に大きい以上である中サイズ:

:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc

変える中サイズそして窒素必要な値で計算します(vim自分でやりたくない場合は、単純な暗算を直接実行することもできます)。これは.VimL の文字列連結演算子です。明らかに、これは大量のキーストロークのみを保存します。中サイズ。この機能を頻繁に使用する場合、上記の内容をカスタムコマンドまたは一部の種類の関数に入れると、入力する内容がかなり多いため、時間を節約できます。

おすすめ記事