web-dev-qa-db-ja.com

Vim:sは、行の最初のN <gオカレンスを置き換えます

Vimでは、行の最初の数件の一致を置き換える機会がある場合がありますが、gのようにすべてが一致するわけではありません。例えば。:

_a a a a a
_

_b b b a a
_

_:s/a/b/[enter]:[up][enter]:[up][enter]_を使用できることはわかっていますが、これは3回の繰り返しで十分に退屈です。
私はもう試した:

  • _: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_:ファイル内の次のaaを含む3行目の間にある各行の最初の出現を変更します(必要に応じて反転するように要求します)。
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/:thisとnextの間の各行の最初の出現箇所を3 asで変更します(これは複数文字の検索に簡単に拡張できませんでした)。

その他のさまざまなアドレス指定パターンがあり、どれも機能しませんでした。私は、この問題の答えを見つけようとする_:s_コマンドについてかなりのことを学びましたが、まだ解決していません。

誰でもこれを行う方法を知っていますか?

(特定の範囲のボーナスポイント、たとえば2番目から4番目の出現)

13
Kevin

_:s/pattern/replacement/gc_ idea from Samus _ (これは、置換文字列内にパターンが含まれている場合に正しい操作を保証する最も簡単な方法のようです)に基づいて、2番目から4番目の出現箇所を1つに置き換えますライン:

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

feedkeys()は、入力文字列をキーボード入力キューに入れる関数です。重要なのは、カウントを前もって行うことです。これにより、カウントの喪失や中断を心配する必要がなくなります。

より一般的なケースでは、MthからNthのオカレンスを[〜#〜] n [〜#〜]の1行が非常に大きい以上[〜#〜] m [〜#〜]

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

[〜#〜] m [〜#〜][〜#〜] n [〜#〜を置き換えます]必要な値を使用します(自分で計算したくない場合は、vimに簡単な暗算を実行させることもできます)。 _._はVimLの文字列連結演算子であることに注意してください。明らかにこれは大きな[〜#〜] m [〜#〜]のキーストロークのみを保存します。この機能を頻繁に使用する場合は、タイプするのがかなり難しいので、上記をカスタムコマンドまたはカスタム関数に入れる時間を節約できます。

10
jw013

最初の質問については、次のようにします。

:s/a/b
&&

2つ目はトリッキーです。自動で行う方法はわかりませんが、vimで次のように一致するたびにプロンプ​​トを表示させることができます。

:s/a/b/gc

次に、最初のn個の一致に「いいえ」、他の一致に「はい」と応答します。

8
Samus_
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

:3,6g/^/let i=0 | while i<3 | s/a/b/ | let i+=1 | endwhile

a a a a a
a a a a a
b b b a a
b b b a a
b b b a a
b b b a a
a a a a a
6
kev

私はこれがうまくいくと思います、最初に交換してから2回繰り返します:

:s/a/b/
2@:
1
ddsun