Hack #27: 選択範囲の数値を増分する
Posted at 2009/06/16ツイート
問題
Normal modeで<C-a>を打鍵するたびに、カーソル下の数値を1加算した値に置き換えることができます。また、3<C-a>などと打鍵することによって一度に指定した数値分だけ増分することができます。
しかし加算したい数値が複数あるときに、いちいちカーソルを移動して各数値の位置に移動して<C-a>を打鍵するのは非常に困難です。
解決
以下のコマンドで編集中バッファ内に現れる全ての数値を1加算します。
:%s/[0-9]\+/\=submatch(0)+1/g
また、Visual modeで範囲を選択してから上記コマンドを入力すると、選択範囲の行に現れる全ての数値を1加算します。
議論
<C-a>はmotionを受け取って範囲を指定して一気に処理するという機能が標準で提供されているわけではないので、上記のような別の方法が必要となります。
多くの場合:s[ubstitute]/{pattern}/{string}/[flags]
の{string}
部分には置き換え文字列を記述しますが、この部分を\=
で始めることにより、任意の式を用いて記述することができます。<C-a>ではなくVimの式の+
を用いて加算しています。これは:echo 1+2
などで使われる+
です。
なお、同様に数値を減らすには<C-a>のかわりに<C-x>を、あるいは:%s/[0-9]\+/\=submatch(0)-1/g
を用います。
参考
:h sub-replace-expression
もどる
blog comments powered by Disqus