2012/09/21

vimで保存するときにマジックコメントを埋め込む

最近ちまちまと.vimrcを再構築している @pinzolo です。

Ruby1.9+Railsで開発しているとちょくちょくやらかすのがのがエンコーディングの指定忘れ。 rails gで作られるファイルはマジックコメントがないので日本語入力して実行したらエラーになるわけですな。

んで世のエンジニアはそれをどう解決するかというのを調べてみた。

  1. ショートカットで先頭にマジックコメントを埋め込む
  2. magic-commentermagic-encodingのようなツールで一括付与

というのが結構多かった。 でも、1.は忘れることがあるし、2.はジェネレートするたびに行うのはめんどくさい。 じゃあどうするのが一番いいかと考えたら、保存時に追加されるのが一番だと思った。

エディタで保存を実行しないファイルは編集をしないのだからマジックコメントなくても問題無いわけだ。

class HogeHelper
end

こんなファイルはマジックコメントをいちいち付けなくていいや。というスタンスです。 というわけで、.vimrcに保存時にマジックコメントを追加する処理を書いてみた。

" マジックコメント自動追加関数
function! AddMagicComment()
let pos = getpos('.')
let line_index = 1
let magic_comment = '# coding: utf-8'
if &filetype == 'ruby'
let line = getline(line_index)
if line[0:1] == '#!'
let line_index = 2
endif
elseif &filetype == 'haml'
let magic_comment = '-'.magic_comment
elseif &filetype == 'eruby'
let magic_comment = '<%'.magic_comment.' %>'
endif
let line = getline(line_index)
if line =~ 'coding:'
return
endif
call cursor(line_index, 0)
execute ':normal O'.magic_comment
call setpos('.', pos)
endfunction
autocmd BufWritePre *.rb,*.erb,*.haml call AddMagicComment()<CR>

vimscriptなんて今までろくに書いたことがなかったからなかなか大変だった。以下、気にしたポイント。

  • 対象とするのは ruby, ERB, Haml の三種類。
  • ruby の場合は shebang の存在も考慮する。
  • すでにマジックコメントが存在する場合は付与しない。
  • マジックコメントは 1 行目。shebang があるときは 2 行目。
  • マジックコメントの形式は emacs 形式にしようか迷ったけど、自分の環境では vim しか使わないからまあいいや。

ソースコードは間違ってないと思うのだけど、いざ保存すると必ず E488 エラーがでる。
正直なんでかわからん。有識者の方々教えてください。
動作に影響はないからとりあえずこのままにしてる。エラーメッセージがうざかったらとりあえず :silent! つければいいや。

とまあ、微妙に不完全なシロモノですがよければお試しください。