2013年5月2日

Emacs のタイ文字環境

タイ文字入力したいなーって時、ありますよね。

まずは基本になるタイ文字用のフォントを指定します。
元になるフォント設定がこちら。Mac の Emacs 24.1.1 用の設定です。

(setq my-font "-apple-Monaco-medium-normal-normal-*-*-*-*-*-m-0-fontset-startup")
(setq fixed-width-use-QuickDraw-for-ascii t)
(setq mac-allow-anti-aliasing t)
(set-default-font my-font)
(add-to-list 'default-frame-alist `(font . ,my-font))
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0208
 '("Hiragino Maru Gothic Pro" . "iso10646-1"))
(setq face-font-rescale-alist
      '(("^-apple-hiragino.*" . 1.2)
        (".*osaka-bold.*" . 1.2)
        (".*osaka-medium.*" . 1.2)
        (".*courier-bold-.*-mac-roman" . 1.0)
        (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
        (".*monaco-bold-.*-mac-roman" . 0.9)
        ("-cdac$" . 1.3)))

やっぱり等幅がいいですね。ayuthaya がソレっぽいので追加しましょう。

(set-fontset-font
 (frame-parameter nil 'font)
 'thai-tis620
 '("ayuthaya" . "iso10646-1"))

これで、どこかからコピペしてくきた文字が読めます。



ところがワタシは小さいタイ文字は読み慣れないので文字を倍のサイズにします。全角扱いにする方法は知らないのでケタ数がちょっとアレ。あと行が縦に伸びる。

(setq face-font-rescale-alist
      '(("^-apple-hiragino.*" . 1.2)
        (".*osaka-bold.*" . 1.2)
        
        (".*ayuthaya.*" . 2.0)
        
        (".*osaka-medium.*" . 1.2)
        (".*courier-bold-.*-mac-roman" . 1.0)
        (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
        (".*monaco-bold-.*-mac-roman" . 0.9)
        ("-cdac$" . 1.3)))



やったー読みやすい!

さて、ここで問題がヒトツ。๛ と ๚ が表示できません。


ayuthaya に入っていないのか、マッピングがおかしな事になっているのか。とりあえず thonburi に入ってたので、こっちでで代用します。幅はズレちゃうけど。

(set-fontset-font
 nil
 '#x0E5A
 '("thonburi" . "iso10646-1"))
(set-fontset-font
 nil
 '#x0E5B
 '("thonburi" . "iso10646-1"))

(setq face-font-rescale-alist
      '(("^-apple-hiragino.*" . 1.2)
        (".*osaka-bold.*" . 1.2)
        
        (".*ayuthaya.*" . 2.0)
        (".*thonburi.*" . 2.0)
        
        (".*osaka-medium.*" . 1.2)
        (".*courier-bold-.*-mac-roman" . 1.0)
        (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
        (".*monaco-bold-.*-mac-roman" . 0.9)
        ("-cdac$" . 1.3)))



表示はこれでとりあえず OK。

次に入力です。もちろん Mac の設定で Thai のキーボードを追加してもいいのですが、切り替えが面倒なので Emacs 側で解決する事にします。Emacs 側で解決するなら、最初から入っている thai-kesmanee を使う事もできます。

これで入力できちゃいます。ただ、キーボードが日本語だとマッピングが一部おかしくなっちゃうので困ったカンジ。

手っ取り早く対策しよう、ってコトでマッピングを変えたバージョンの input-method を定義しちゃいましょう。
元にするファイルは Emacs.app/Contents/Resources/leim/quail/thai.el.gz
ここから必要そうな部分だけ抜き出して、パスの通った所に適当なファイル名で保存します。

(require 'quail)

(defmacro thai-jp-generate-quail-map (translation-table)
  (let (map)
     (dotimes (i (length translation-table))
       (let ((trans (aref translation-table i)))
         (when (not (eq trans 0))
           (if (> (length trans) 1)
               (setq trans (vector trans))
             (setq trans (aref trans 0)))
           (setq map (cons (list (char-to-string i) trans) map)))))
     `(quail-define-rules ,@map)))

;; Thai Kesmanee on jp keyboard support.

(quail-define-package
 "thai-jp" "Thai" "กJ>" t
 "Thai Kesmanee input method on JP106 keyboard layout"
 nil t t t t nil nil nil nil nil t)

(thai-jp-generate-quail-map
 [
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0       ; control codes
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0       ; control codes
  0  "+" "๑" "๒" "๓" "๔" "ู" "฿" ; S ! " # $ % & '
  "๕" "๖" "." "ซ" "ม" "ข" "ใ" "ฝ"       ; ( ) * + , - . /
  "จ" "ๅ" "/" "_" "ภ" "ถ" "ุ" "ึ" ; 0 1 2 3 4 5 6 7
  "ค" "ต" "ง" "ว" "ฒ" "๘" "ฬ" "ฦ"       ; 8 9 : ; < = > ?
  "บ" "ฤ" "ฺ" "ฉ" "ฏ" "ฎ" "โ" "ฌ"        ; @ A B C D E F G
  "็" "ณ" "๋" "ษ" "ศ" "?" "์" "ฯ"  ; H I J K L M N O
  "ญ" "๐" "ฑ" "ฆ" "ธ" "๊" "ฮ" "\""       ; P Q R S T U V W
  "\)" "ํ" "\(" "ล" "%" "ฃ" "ช" "๗"      ; X Y Z [ \ ] ^ _
  "ฐ" "ฟ" "ิ" "แ" "ก" "ำ" "ด" "เ"        ; ` a b c d e f g
  "้" "ร" "่" "า" "ส" "ท" "ื" "น"  ; h i j k l m n o
  "ย" "ๆ" "พ" "ห" "ะ" "ี" "อ" "ไ"        ; p q r s t u v w
  "ป" "ั" "ผ" "," "-" "ฅ" "๙" 0  ; x y z { | } ~ D
  ])

(provide 'thai-jp)

保存したらこれを require しておきます。

(require 'thai-jp)

これで、set-input-method 経由で thai-jp が使用できるようになります。

私は日本語入力には SKK を使うので、toggle-input-method はタイ語専用にしちゃいましょう。

(global-set-key "\C-\\" 'toggle-thai-input-method)
(defun toggle-thai-input-method (&optional arg)
  "switch thai-jp input method"
  (interactive "P")
  (if current-input-method
      (inactivate-input-method)
    (set-input-method "thai-jp")))

キーマップはこんな感じ。


Shift+0 が使えないので ๗ は _ のキーで代用。あと % と ฃ も適当な位置に。

それと、๛ と ๚ も適当な位置にマップしておきましょう。

(global-set-key "\M-[" (lambda () (interactive) (insert-thai-jp '#x0E5B)))
(global-set-key "\M-]" (lambda () (interactive) (insert-thai-jp '#x0E5A)))
(defun insert-thai-jp (code)
  "insert character in thai-jp mode"
  (if (equal current-input-method "thai-jp")
      (insert code)))

うーんなんとも適当。

0 件のコメント:

コメントを投稿