vim-users.jp

Hack #205: 複数行をコメントアウトする

Posted at 2011/03/08
このエントリーをはてなブックマークに追加

問題

普段のコーディングにおいて、ある程度のコードの塊をまとめてコメントアウトしたくなることがありせんか。 コメントアウトしたコードは大抵不要となり捨てることになるのですが、一時的にリファクタリング前のコードを残したり、デバッグなどの際に止めを得ずコメントの付け外しを行うことがあるかと思います。

コードのコメントアウトと聞いてすぐに思い浮ぶのは, Hack #12: 条件にマッチする行を削除する にあるような I# <Esc> とする方法です。 しかしながら、この方法では複数行をコメントアウトするのに時間がかかり、気がつけば Fibonacci 数列を求めるコードを 3 パターンほど記述出来る程度の時間を浪費していることもあります。

別解として ^<C-v>jjjI# <Esc> などとして、コメントアウトする方法もありますが、行頭がずれていたりすると大変面倒です。

解決方法

もっとも手頃な方法として commentout.vim を使用する方法が挙げられます。 これは vim online Tip #271: easy (un)commenting out of source code として掲載されていたもので 参照資料1 に詳しい解説があります。

また Tip 1570 Commenting with opfunc で紹介されているスクリプトを利用する方法もあります。 オリジナルは Ruby に対応していなかったため、一部修正を加えています。

" Comment or uncomment lines from mark a to mark b.
function! CommentMark(docomment, a, b)
  if !exists('b:comment')
    let b:comment = CommentStr() . ' '
  endif
  if a:docomment
    exe "normal! '" . a:a . "_\<C-V>'" . a:b . 'I' . b:comment
  else
    exe "'".a:a.",'".a:b . 's/^\(\s*\)' . escape(b:comment,'/') . '/\1/e'
  endif
endfunction

" Comment lines in marks set by g@ operator.
function! DoCommentOp(type)
  call CommentMark(1, '[', ']')
endfunction

" Uncomment lines in marks set by g@ operator.
function! UnCommentOp(type)
  call CommentMark(0, '[', ']')
endfunction

" Return string used to comment line for current filetype.
function! CommentStr()
  if &ft == 'cpp' || &ft == 'java' || &ft == 'javascript'
    return '//'
  elseif &ft == 'vim'
    return '"'
  elseif &ft == 'python' || &ft == 'perl' || &ft == 'sh' || &ft == 'R' || &ft == 'ruby'
    return '#'
  elseif &ft == 'lisp'
    return ';'
  endif
  return ''
endfunction

nnoremap <Leader>c <Esc>:set opfunc=DoCommentOp<CR>g@
nnoremap <Leader>C <Esc>:set opfunc=UnCommentOp<CR>g@
vnoremap <Leader>c <Esc>:call CommentMark(1,'<','>')<CR>
vnoremap <Leader>C <Esc>:call CommentMark(0,'<','>')<CR>

コメントアウトしたい箇所を Visual mode で選択し、<leader>c を打鍵することで Filetype に沿ってコメントアウトされます。 逆に、コメントアウトされた箇所を Visual mode で選択し <leader>C を打鍵することでコメントを外すことも出来ます。

また、<leader>cip などと打鍵することで、text-objects の単位でのコメントアウトも可能です。コメントを外す際は <leader>Cip と打鍵します。

参照資料

Sixeight

もどる
blog comments powered by Disqus