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

C言語風ブロックコメントを自動挿入する

vim

vimmerのみなさんこんにちは。
駆け出しvim使い4年目のlevelfourです。
vim scriptとかマクロとか使う超越者を震えながら見つめる日々でございます。

そんな僕も流石にイライラしたのが、ブロックコメントの入力。

/* hogehoge */
void hoge() {}

例のこいつです。
アスタリスク自体が要Shiftで若干ウザい上に、これを2回も繰り返した挙げ句、一度コメントブロック内に戻らないといけない。これはイライラする。

普段は「そういうプラグイン or vimrcねーかなー(ハナホジ」とググる僕ですが、今回は見つけられなかった。
というか、恐らくこの程度なら超越者たるvimmerのみなさんはササッと書いてしまうんですよね。たぶん。
でも、僕のようなキーバインドだけvim使ってるゆるふわ勢には無理なんですよ。
というわけで、頑張ってvimのマクロとか設定の仕方を調べながら書いてみました。
僕のようなゆるふわ勢の方々の参考になれば幸いです。

結論

let @c='O/* */^[3ha'
noremap cc @c

を.vimrcに書いておけば、ccで呼び出せます。

マクロ

マクロは一連のトランザクション@*というコマンドに当てる機能です。
今回はブロックコメント挿入ということで、commentのcをとって@cとしました。
エディタモードでマクロを定義するには、qコマンドを使います。

qc
" マクロにまとめたいトランザクション
q

q*でrecordingモードに入り、もう一度qでrecordingを抜けます。
その間に行った操作を@*で呼び出せます。

例えば
qiiHello,world!q
と入力すれば、@iとタイプすることでiを実行し、「Hello,world!」を挿入します。


また、vim scriptでマクロを定義するときには、@*という変数に代入する体裁で記述します。

let @i='iHello,world!'

という具合です。

キーリマッピング

vimのノーマルモードにおけるキーバインドのリマッピングは、noremapというコマンドを使用します。

noremap [リマップ先コマンド] [リマップ元コマンド]

例えば、noremap g iとすれば、gを入力するとインサートモードに入ります(やるなよw)。

<Esc>の入力

これいちばんハマりました。上の結論に書いた設定ですが、^[だけハイライトカラーが違いますね。
実はあれ、"^"と"["という2文字ではなく、"^["という一文字で<Esc>を表しているのです。
入力方法は

<Ctrl+V><Esc>

です。<Ctrl+V>で特殊文字が入力できるらしいですね。

というわけで改めて再掲

let @c='O/* */^[3ha'
noremap cc @c

<Esc>の入力に注意してくださいね。

所感

一つ。キーバインドのリマッピングをするときに、どのキーバインドを潰すのかちょっと悩んだ。
結局、僕が普段絶対に使わない(というか誤爆でしか発動しない)ccに当てることにした。
けれど、本物のvimmerの方がこれを見ると「なんてけしからん」と思うかもしれない。
それでも僕はこれまでcなんて使うことがなかったんだよね。実際使うのだろうか。教えてくださいvimのすごいひと。

二つ。vimemacsは自分好みにカスタマイズしまくると、デフォルト環境で生産性がとても落ちるのでよくないという話を耳にする。
確かに一理あると思う。僕も新しいサーバをセットアップするときにデフォルト状態のvimで「あれ、このプラグインないのかよorz」と思いながら作業をすることもしばしばある。
でも実際、今回みたいなコメント挿入ってカスタマイズしないとイライラが溜まって仕方ないと思う。
このあたりの駆け引きというか、バランスというか、難しいところだなあって。

追記[3/2]

ありがたいことにTwitterまさかりコメントをいただきました。感謝!!

これを元にもう一度自分流に書き直したのがこれ。

inoremap /* /* */^[3ha

inoremapはインサートモードでも効くキーバインドだよね。
確かに/*に当てればよかったんだ。先入観でついついアルファベットにしか当てられないものと思い込んでいた。