commentop.vim
はじめに
あまり勧められたものではありませんが、ちょっとしたデバッグやテストで、複数行をコメントアウトしたり、頻繁にコメントON/OFFを切り替えることはよくあります。一般的にこれをvimで行おうとした場合、先頭に移動(^)、矩形ビジュアル(C-V)、下に移動(4l)、コメント挿入(I//<ESC>)と結構な手順を踏む必要が出てきます。もっと簡単に、1コマンドで現在行のコメントをトグルしたり、複数行を[count]指定でコメントアウトしたり、オペレータとして{motion}を指定しながらコメントアウトしたい(この-段落を-コメントアウト!)という欲求には抑えがたいものがあります。
概要
commentop.vimは、行単位コメントをトグル/挿入/削除するための[count]コマンドとオペレータ{motion}を導入するvimプラグインです。ここでいう行単位コメントとは、「先頭のスペースとタブを除き行全体がコメント」であるものとします。つまり、
// static int foo;は該当しますが、何かしらの文字列の後にコメントがある場合
int main() { // ここからはじまるは該当しません。C++でいう//や、vimスクリプトでは#など、行単位コメントには様々な形式がありますが、これはvimがftpluginとしてファイルタイプごとに持っているコメントの形式(commentstring)を利用し、自動的に各ファイルタイプに適したコメントを選択します。勿論commentstringが提供されていないファイルタイプに対する定義を与えたり、既存のcommentstringを無視して独自のコメント形式を利用することも簡単にできます。
インストール
- commentop.vim - commands and operators to comment/uncomment lines in many languages : vim onlineからcommentop.vimの最新版をダウンロードします。v1.1.0はそれ以前のものと<Plug>のマップ名に互換性がないので、移行する際は注意してください(独自にキーマップを設定し直さない場合は関係ありません)
- ダウンロードしたcommentop.vimを~/.vim/plugin/か、/usr/share/vim/vim*/plugin/に配置します。
- Vimを起動すれば自動的に読み込まれます。試しにcommentop.vimを読み込み、goGなどとしてみてください。
使用方法
このスクリプトはノーマルモード、ビジュアル、オペレータの3種それぞれに対し、コメントのトグル/挿入/削除の3種のコメント操作方法を定義しています。オペレータとは、元々あるyとかdとかcのようなもので、続けて移動コマンド({motion}と表記しています)を入力することで、その移動範囲に対して操作が実行されます。lやGなどの普通の移動も、ipのようなテキストオブジェクトも扱えます。
| ノーマル | ビジュアル | オペレータ | |
|---|---|---|---|
| トグル(ON⇔OFF) | co | co | go{motion} |
| 挿入 | cO | cO | gO{motion} |
| 削除 | c<C-O> | c<C-O> | g<C-O>{motion} |
ノーマルとビジュアルはまったく同じです。coのcはcommentのcと覚えると分かりやすいでしょう。オペレータでは原理的に文字を変える必要がありcが使えないため、デフォルトではgとしています。トグル、挿入、削除はどのモードでもそれぞれo, O, <C-O>です。よく使う順に押しやすい物にしたつもりです。
使用例
co
今いる1行のコメントをトグルします。
3cO
今いる1行から3行ぶん、コメントを挿入します。
(ビジュアルにて選択後) c<C-O>
選択範囲を含む行すべての行頭からコメントを取り除きます。
goip
パラグラフ一つに対しコメントをトグルします。
gOa{現在の{}ブロック全体をコメントアウトします。
.vimrcでカスタマイズする
キーマップ
デフォルトのキーマップは上に示したとおりですが、.vimrcの中で簡単に好みに合わせて設定することができます。ノーマル・ビジュアルに関しては、nmapとvmapで(あるいは併せてmapで)<Plug>Commentop[*]NVをrhsとして好きなキーにマップします。例えば\c, \C, \<C-C>にマップする場合、
map <Leader>c <Plug>CommentopToggleNV map <Leader>C <Plug>CommentopAppendNV map <Leader><C-C> <Plug>CommentopRemoveNVのようにします。
オペレータはnmapで<Plug>Commentop[*]OPに割り当てます。例えば\g \G \<C-G>にマップする場合、
nmap <Leader>g <Plug>CommentopToggleOP nmap <Leader>G <Plug>CommentopAppendOP nmap <Leader><C-G> <Plug>CommentopRemoveOPのようにします。
コメント文字列の指定
コメント文字列はデフォルトではvimのftpluginが指定するcommentstringを使用しますが、その定義を上書きしたり、独自に定義することも可能です。.vimrcに
CommentopSetCommentType ファイルタイプ 削除の正規表現パタン 挿入文字列を記述します。例えば、既にスクリプト中で同様に定義されていますが、
CommentopSetCommentType matlab ^%[\ <TAB>]\\{,1} %\ (←行末の空白に注意!)
とすることでmatlab用のコメント%を定義することができます。削除パタンの意味は、行頭(ここでいう行頭とは本当の行頭ではなく、コメント挿入位置の先頭という意味です)、記号%、スペースまたはタブが最大1文字、です。つまり
%comment (削除↓) comment (挿入↓) % comment % comment (削除↓) comment % comment (スペース3つ) (削除↓) comment (スペース2つ)のように、最大1文字分のスペースを含めて%を削除します。挿入時は%と直後にスペース1文字を挿入します。
