最近の更新

関連


その他いろいろ

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

はやくMODx 2.0でないかなあ

commentop.vim

各言語に適した行単位コメントをトグル/挿入/削除するコマンド/オペレータ
初出:2009年07/12 更新:2009年07/12

この文書のキーワード: なし

はじめに

あまり勧められたものではありませんが、ちょっとしたデバッグやテストで、複数行をコメントアウトしたり、頻繁にコメント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を無視して独自のコメント形式を利用することも簡単にできます。

インストール

  1. commentop.vim - commands and operators to comment/uncomment lines in many languages : vim onlineからcommentop.vimの最新版をダウンロードします。v1.1.0はそれ以前のものと<Plug>のマップ名に互換性がないので、移行する際は注意してください(独自にキーマップを設定し直さない場合は関係ありません)
  2. ダウンロードしたcommentop.vimを~/.vim/plugin/か、/usr/share/vim/vim*/plugin/に配置します。
  3. Vimを起動すれば自動的に読み込まれます。試しにcommentop.vimを読み込み、goGなどとしてみてください。

使用方法

このスクリプトはノーマルモード、ビジュアル、オペレータの3種それぞれに対し、コメントのトグル/挿入/削除の3種のコメント操作方法を定義しています。オペレータとは、元々あるyとかdとかcのようなもので、続けて移動コマンド({motion}と表記しています)を入力することで、その移動範囲に対して操作が実行されます。lやGなどの普通の移動も、ipのようなテキストオブジェクトも扱えます。

ノーマルビジュアルオペレータ
トグル(ON⇔OFF)cocogo{motion}
挿入cOcOgO{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文字を挿入します。