Emacsで文字クラスの置換ってどうやるのかな

Emacsで全角の数字を半角にしたい、というので、以下のように書いた。

(defun numerics-to-hankaku ()
  (interactive)
  (tr '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
      '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")))

(defun tr (before after)
  (goto-char (point-min))
  (replace-string
   (car before) (car after))
  (if (cdr before)
      (tr (cdr before) (cdr after))))

RubyでいうRangeオブジェクトのリテラルとかってないのかな。

しかし、実はGNU Emacsにはjapanese-hankaku-regionという標準の関数が用意されているのだった。

;; zenkaku to hankaku

(defun charclass-to-hankaku-buffer (reg)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward reg (point-max) t)
      (japanese-hankaku-region (match-beginning 0) (match-end 0)))))

(defun numerics-to-hankaku ()
  (interactive)
  (charclass-to-hankaku-buffer "[0-9]+"))

(defun alphabets-to-hankaku ()
  (interactive)
  (charclass-to-hankaku-buffer "[a-zA-Z]+"))

(provide 'zenhan)