保存時に自動でRuby 1.9のmagic commentをつける〜Ruby 1.8ユーザーも用意を

Ruby 1.9で実行するスクリプトに日本語を書く場合、スクリプト文字コードを表すmagic commentは事実上必須となる。しかし、いちいち手で書くのは面倒臭い。Emacsは編集中のバッファの文字コードを知っているんだから、Emacsに書かせればいい。誰かがやってそうな気がするけど、見つからなかったので速攻で書いた。
別の文字コードで保存した場合には、magic commentも追随する。narrowingにも対応している。
Ruby 1.8を使っている人も将来Ruby 1.9に移行することになるので今のうちにやっておくといい。Ruby 1.8ではmagic commentは無視されるだけなのでつけていても問題ない。

(defun ruby-insert-magic-comment-if-needed ()
  "バッファのcoding-systemをもとにmagic commentをつける。"
  (when (and (eq major-mode 'ruby-mode)
             (find-multibyte-characters (point-min) (point-max) 1))
    (save-excursion
      (goto-char 1)
      (when (looking-at "^#!") 
        (forward-line 1))
      (if (re-search-forward "^#.+coding" (point-at-eol) t)
          (delete-region (point-at-bol) (point-at-eol))
        (open-line 1))
      (let* ((coding-system (symbol-name buffer-file-coding-system))
             (encoding (cond ((string-match "japanese-iso-8bit\\|euc-j" coding-system)
                              "euc-jp")
                             ((string-match "shift.jis\\|sjis\\|cp932" coding-system)
                              "shift_jis")
                             ((string-match "utf-8" coding-system)
                              "utf-8"))))
        (insert (format "# -*- coding: %s -*-" encoding))))))

(add-hook 'before-save-hook 'ruby-insert-magic-comment-if-needed)