リージョン内の全角カタカナのみを半角文字に変換する


ということで書いてみました.

はじめに

Emacsには japanese-hankaku-regionという関数があって, 全角文字を
半角文字に変換してくれるんですが, 全角ひらがなも全角カタカナも半角カタカナにして
しまうという問題(?)があります.

コード

(defun japanese-hankaku-region-only-katakana (from to &optional ascii-only)
  (interactive "r\nP")
  (save-restriction
    (narrow-to-region from to)
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward "\\cK" nil t)
	(let* ((zenkaku (preceding-char))
               (zenkaku-str (char-to-string zenkaku))
	       (hankaku (or (and (not ascii-only)
				 (get-char-code-property zenkaku 'jisx0201))
			    (get-char-code-property zenkaku 'ascii))))
	  (when hankaku
            (japanese-replace-region (match-beginning 0) (match-end 0)
                                     hankaku)))))))

https://gist.github.com/syohex/6569391

例文


M-x japanese-hankaku-regionだとひらがなも変換されてしまう

M-x japanese-hankaku-region-only-katakanaだとひらがなはそのまま

おわりに

問題がありましたら, twitter等でお知らせください.