Yet another 連番生成するVimプラグイン
はじめに
一体何番煎じなのか分かりませんが,連番生成するvimプラグインを作りました.
といっても,改行するごとに数字が増えていく,というタイプの連番に特化したものです.
私は普段,Igor Proという解析ソフトのスクリプトをよく書きます.その際,一行コピペしてその行の数字を1ずつ増やす,という作業が頻出したため,これをなんとか楽にしようと思ったのが今回の動機です*1.
ぐぐってみたところ,vimで連番生成するには,マクロを使うかvim.rengbangが定番とのこと.
ただ,マクロはその行に何回数字が現れるのかで変わってくるし,正規表現を使うvim.rengbangはプログラミングが本職でない自分には敷居が高いし...
そんな中,最近のvimではvisualモードでg<C-a>することで,1行ごとに増分を増やしつつインクリメントできるのを知りました(vim-jp » Visual モード時の CTRL-A/CTRL-X について).
かなり直感的で分かりやすかったのですが,これは各行の最初に見つかった数字にしか作用しません.
そこで,行全体にインクリメントするコマンドと,行を単位としてvisualモードでg<C-a>するコマンドを作りました.
インストール
NeoBundle "ryotako/vim-incline" NeoBundle "tpope/vim-repeat" // 必須ではないが,入れるとドットリピートが可能に.
マッピング
" <C-a>や<C-x>のように使います。 " 3gaとすれば現在の行に含まれる数値が3ずつインクリメントされます。 map ga <Plug>(incline-inc) map gx <Plug>(incline-dec) " 行選択モードでのみ、行全体インクリメントを適用します。 " 通常のビジュアルモードや矩形選択モードでは標準の<C-a>, <C-x>を適用します。 vmap <expr> <C-a> mode() ==# "V" ? "\<Plug>(incline-inc)" : "\<C-a>" vmap <expr> <C-x> mode() ==# "V" ? "\<Plug>(incline-dec)" : "\<C-x>" " 行選択モードで選択した行のインクリメントを行いますが、インクリメントする数値が後の行ほど増えます。 " 連番の生成をするのに便利です。 vmap <expr> g<C-a> mode() ==# "V" ? "\<Plug>(incline-inc-inclined)" : "g\<C-a>" vmap <expr> g<C-x> mode() ==# "V" ? "\<Plug>(incline-dec-inclined)" : "g\<C-x>"
おわりに
ぶっちゃけると,一度Vimのプラグインを作ってみたかった,というのが正直なところです.(なので,コードにつっこみとか入れてもらえるととても嬉しい)
他の連番生成プラグインのような汎用性はないものの,素の<C-a>やg<C-a>と挙動が似ているのが特徴かと思います.
本当は英語ドキュメントとかしっかり書こう,と思っていたのですが,最近また新たな連番生成プラグインが生まれていたので,焦って記事にした次第でした.
*1:冒頭のデモのような状況では,Igor Proの仕様上forループが回せないのです.