Exスタイルの置換コマンドで連続番号を使用するにはどうすればよいですか?


8

たとえば、「Do」という単語で始まるすべての行の前に数字を入れたいとしましょう。コマンドはの:%s/^(Do )/1. \1/ようになりますが、毎回同じ番号ではなく連続して番号を適用するにはどうすればよいですか?

マクロとCtrl-Aを使用してこれを行う多くの方法をよく知っていますが、より複雑なExモードコマンドで使用するために、タイトルの質問に対する答えを正確に知りたいことに注意してください。

マクロアプローチがそれほど簡単ではない別の例として、「Section」という単語のすべてのインスタンスに番号を追加し、それらに連続番号を付け、「Chapter」で始まる各行の後にカウントを再開したいとします。追加する数を実際に増分することを除いて、これをほぼ実行できるEx-modeコマンドは次のとおりです。

:g/^Chapter/;/^Chapter/-s/Section\zs/ 1/g

Exモードの代替コマンドで数値をインクリメントする簡単な方法が非常に役立つことがわかります。

回答:


8

このコマンドはあなたが望むことをします:

:let i = 1|g/^Do/s/^/\=i/|let i = i + 1

説明…

  • let i = 1初期化は、カウンターi
  • g/^Do/s/^/\=i/プリペンドiで始まる各行にDo
  • let i = i + 1増分i

コツは、次の置換の前にインクリメントが発生することです。

---編集---

単一の置換を使用した場合、すべてが行われた後、カウンターは1回だけ増分されます。

一致する行ごとに1つずつではなく、複数の置換を実行しているため、次の置換の前にカウンターが正しくインクリメントされます。


数字の後にドットを付けるにはどうすればよいですか?\=i. 無効な式です。
デビッドコンラッド

2
@DavidConrad .は、\=式の連結演算子になります。だから チェックアウトs//\=i . '. '/を追加'. ':help expression-syntaxます。
ワイルドカード

インクリメントは置換の後に起こります
クリスチャンブラバンド

@ChristianBrabandt、おっと、うっかり一言。
romainl 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.