読者です 読者をやめる 読者になる 読者になる

Yet another 連番生成するVimプラグイン

vim

はじめに

一体何番煎じなのか分かりませんが,連番生成するvimプラグインを作りました.

といっても,改行するごとに数字が増えていく,というタイプの連番に特化したものです.

github.com

f:id:ryotako:20160805211505g:plain

私は普段,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ループが回せないのです.