tcomment.vim拡張してコメントアウトの効率あげる話

## コメントアウトプラグインの不満

僕はずっとEnhancedCommentifyというコメントアウトプラグインを使っていたんですが、
HTML/JS/PHPなど、言語が混在しているファイルの場合、片方のコメントアウト形式しか対応してなくて使いずらいものでした。。

例えば、以下のerubyファイルだとHTML形式のコメントアウト出来ません。

```eruby:hoge.html.erb
<p>
  <b>name:</b>
  <%= @book.name %>ここでコメントアウト。<%# .. %>で出る
</p>

<p>ここでコメントアウト(しかし、<!-- -->ではない)
  <b>price:</b>
  <%= @book.price %><p>
</p>
```

**問題点**

- 混在コードに対応してない!
- 関数ごとコメントアウトなど、もっと便利にコメントアウトしたい...
- <% %>や<?php ?>など、コメントアウト以外でも色々トグルしたい！

混在コードはよくあるケースだと思いますが、キーバインドを変えて対応したり、ft変えたり、面倒ですよね。
また、vimでファイルを編集していると、よく`<?php ?>`や`<%= %>`と打つ機会が多いと思います。

## tcomment.vim

こちらで解決出来ます。
一度使ったことはあったんですが、キーバインドが使いづらく止めてしまったんですよね。今は自分で設定出来るので、白羽の矢がたった訳です。
tcomment.vimは、[こちら](http://vimsomnia.blogspot.jp/2010/11/tcomment-vim-plugin.html)でデモムービーを見ることが出来ます。
キーバインドが多く、拡張性にも優れています。

```vim:.vimrc
" インストール
" NeoBundleの場合
NeoBundle 'tomtom/tcomment_vim'

" Bundleの場合
Bundle 'tomtom/tcomment_vim'
```

デフォルトのキーバインドは`<C-_><C-_>`で、
混在言語ファイルでも、同じキーバインドで適切に判断してコメントアウトをしてくれます。
さらに、コメントアウトの種類が多くDocやbegin...endなど多くの形式に対応しています。
テキストオブジェクト？にも微妙に対応しているようで、関数全体や段落もコマンド一つでコメントアウト出来ます。

使用するキーマップは主に以下の通りです

- `<C-_><C-_>`      行、選択箇所をコメントをトグル
- `<C-_>n`          指定したftでコメントをトグル
- `<C-_>s`          詳細にコメント形式を指定してトグル
- `<C-_>p`          関数などブロック全体をトグル
- `gcc`              　　`<C-_><C-_>`と一緒

これらのキーマップの設定を変えるには以下の設定を変更してください。
(デフォルトで使用する場合はvimrcへ設定は必要ありません)

```vim:.vimrc
let g:tcommentMapLeader1 = '<C-_>'          (default: '<c-_>')
let g:tcommentMapLeader2 = '<Leader>'          (default: '<Leader>_')
let g:tcommentMapLeaderOp1 = 'gc'        (default: 'gc')
let g:tcommentMapLeaderOp2 = 'gC'        (default: 'gC')
```

## tcomment.vimをカスタマイズ

もっと他の形式や、<% %>などにも対応すれば開発効率をあげることが出来るはず！
`<C-_>c`などで、選択行を<% %>や<?php ?>でトグルするように設定を追加します。

```vim:.vimrc
" tcommentで使用する形式を追加
if !exists('g:tcomment_types')
  let g:tcomment_types = {}
endif
let g:tcomment_types = {
      \'php_surround' : "<?php %s ?>",
      \'eruby_surround' : "<%% %s %%>",
      \'eruby_surround_minus' : "<%% %s -%%>",
      \'eruby_surround_equality' : "<%%= %s %%>",
\}

" マッピングを追加
function! SetErubyMapping2()
  nmap <buffer> <C-_>c :TCommentAs eruby_surround<CR>
  nmap <buffer> <C-_>- :TCommentAs eruby_surround_minus<CR>
  nmap <buffer> <C-_>= :TCommentAs eruby_surround_equality<CR>

  vmap <buffer> <C-_>c :TCommentAs eruby_surround<CR>
  vmap <buffer> <C-_>- :TCommentAs eruby_surround_minus<CR>
  vmap <buffer> <C-_>= :TCommentAs eruby_surround_equality<CR>
endfunction

" erubyのときだけ設定を追加
au FileType eruby call SetErubyMapping2()
" phpのときだけ設定を追加
au FileType php nmap <buffer><C-_>c :TCommentAs php_surround<CR>
au FileType php vmap <buffer><C-_>c :TCommentAs php_surround<CR>
```

g:tcomment_typesで新しくコメント形式を追加して、:TCommentAs {args}でそれを呼び出しています。
`<C-_>=` => <%= %>でトグル
`<C-_>-` => <% -%>でトグル
`<C-_>c` => ファイル形式から、<?php ?>か<% %>でトグル

これで、大分キーストロークを減らすことできました！
tcomment.vimがあれば、どんな形式だろうと幾つでも登録できるので今後も困ることもなさそう。

ありがとう、またvimと仲良くやっていけそうです。

## tcomment.vimの改善点

どうやら、文中やtext objectが苦手なようで...

##### 選択部分だけコメントアウト

```html:hoge.html
             ↓  visualモードで選択  ↓
<p>ほげほげ ここの文章だけコメントアウト ほげほげ</p>
```

としたくても、うまくいかないようですね。。。

```html:hoge.html
<!-- <p>ほげほげ ここの文章だけコメントアウト ほげほげ</p> -->
```


うーん、何故？
どうせなら、`<C-_><C-_>w`などtext objectでコメントアウトも出来るようにしたいものです。。

いいプラグインがあれば教えてください。
無ければ作るかな！情報お待ちしております。