CoffeeScriptの落とし穴(unmatched OUTDENTで悩まされている方へ)


CoffeeScript便利ですよね。簡単かつ見やすい。
ただし、"unmatched OUTDENT"お前さえいなければの話だ…

原因

例えば次のようなコードを見てみましょう。

sample.coffee
msg = 'caution'
if msg == 'caution'
  alert msg
  msg2 = 'run away'
  if msg2 == 'run away'
    alert msg2
...

このようにif文が入れ子状に入るコードはよく見かけますよね。
vim-coffee-scriptを使っているので、自動でインデントもつけてくれて、便利便利…

…とこれが落とし穴なのです。
初期設定ではvimのタブスペースは8文字分ですが、それ以上のインデントをvim-coffee-scriptのsyntaxでつけようとすると、タブスペースと空白スペースが混ざってしまいます。その結果、見た目は合っているように見えるのに実際はインデントがずれていると認識されてしまう…というわけです。
実際にコンパイルすると「unmatched OUTDENT」なるエラーが発生します。
見た目が合っているだけあって、意外と気づきにくいミスかもしれません。

対策

CoffeeScriptを使う上では(特に初心者)、次の設定は必須でしょう。

.vimrc
...
set expandtab "タブスペースの代わりに空白スペースを挿入
set tabstop=2 "tabキーを押した時のインデント幅を設定
set shiftwidth=2 "syntaxのインデント幅を設定
...

これでもう心配ありません。快適なCoffeeScript生活をお送りください。