comparison lisp/leim/quail/thai.el @ 197:acd284d43ca1 r20-3b25

Import from CVS: tag r20-3b25
author cvs
date Mon, 13 Aug 2007 10:00:02 +0200
parents 43dd3413c7c7
children
comparison
equal deleted inserted replaced
196:58e0786448ca 197:acd284d43ca1
1 ;;; quail/thai.el --- Quail package for inputting Thai characters 1 ;;; quail/thai.el --- Quail package for inputting Thai characters
2 2
3 ;; Copyright (C) 1995 Free Software Foundation, Inc.
4 ;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. 3 ;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
4 ;; Licensed to the Free Software Foundation.
5 5
6 ;; Keywords: multilingual, input method, Thai 6 ;; Keywords: multilingual, input method, Thai
7 7
8 ;; This file is part of GNU Emacs. 8 ;; This file is part of GNU Emacs.
9 9
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details. 18 ;; GNU General Public License for more details.
19 19
20 ;; You should have received a copy of the GNU General Public License 20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to 21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
23 24
24 ;;; Code: 25 ;;; Code:
25 26
26 (require 'quail) 27 (require 'quail)
27 (require 'language/thai-util) 28 (require 'thai-util)
28 29
29 (eval-and-compile 30 (eval-and-compile
30 31
31 (defvar thai-keyboard-mapping 32 (defvar thai-keyboard-mapping-alist
32 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes 33 '((kesmanee
33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes 34 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
34 0 "#" ",TF(B" ",Tr(B" ",Ts(B" ",Tt(B" "0,TQi1(B" ",T'(B" ; SPC .. ' 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
35 ",Tv(B" ",Tw(B" ",Tu(B" ",Ty(B" ",TA(B" ",T"(B" ",Tc(B" ",T=(B" ; ( .. / 36 0 "#" ",TF(B" ",Tr(B" ",Ts(B" ",Tt(B" "0,TQi1(B" ",T'(B" ; SPC .. '
36 ",T((B" ",TE(B" "/" "_" ",T@(B" ",T6(B" ",TX(B" ",TV(B" ; 0 .. 7 37 ",Tv(B" ",Tw(B" ",Tu(B" ",Ty(B" ",TA(B" ",T"(B" ",Tc(B" ",T=(B" ; ( .. /
37 ",T$(B" ",T5(B" ",T+(B" ",TG(B" ",T2(B" ",T*(B" ",TL(B" 0 ; 8 .. ? 38 ",T((B" ",TE(B" "/" "_" ",T@(B" ",T6(B" ",TX(B" ",TV(B" ; 0 .. 7
38 ",Tq(B" ",TD(B" ",TZ(B" ",T)(B" ",T/(B" ",T.(B" ",Tb(B" ",T,(B" ; @ .. G 39 ",T$(B" ",T5(B" ",T+(B" ",TG(B" ",T2(B" ",T*(B" ",TL(B" ",TF(B" ; 8 .. ?
39 ",Tg(B" ",T3(B" ",Tk(B" ",TI(B" ",TH(B" ",Tn(B" ",Tl(B" ",TO(B" ; H .. O 40 ",Tq(B" ",TD(B" ",TZ(B" ",T)(B" ",T/(B" ",T.(B" ",Tb(B" ",T,(B" ; @ .. G
40 ",T-(B" ",Tp(B" ",T1(B" ",T&(B" ",T8(B" ",Tj(B" ",TN(B" "\"" ; P .. W 41 ",Tg(B" ",T3(B" ",Tk(B" ",TI(B" ",TH(B" ",Tn(B" ",Tl(B" ",TO(B" ; H .. O
41 ")" ",Tm(B" "(" ",T:(B" ",T_(B" ",TE(B" ",TY(B" ",Tx(B" ; X .. _ 42 ",T-(B" ",Tp(B" ",T1(B" ",T&(B" ",T8(B" ",Tj(B" ",TN(B" "\"" ; P .. W
42 ",T#(B" ",T?(B" ",TT(B" ",Ta(B" ",T!(B" ",TS(B" ",T4(B" ",T`(B" ; ` .. g 43 ")" ",Tm(B" "(" ",T:(B" ",T_(B" ",TE(B" ",TY(B" ",Tx(B" ; X .. _
43 ",Ti(B" ",TC(B" ",Th(B" ",TR(B" ",TJ(B" ",T7(B" ",TW(B" ",T9(B" ; h .. o 44 ",T#(B" ",T?(B" ",TT(B" ",Ta(B" ",T!(B" ",TS(B" ",T4(B" ",T`(B" ; ` .. g
44 ",TB(B" ",Tf(B" ",T>(B" ",TK(B" ",TP(B" ",TU(B" ",TM(B" ",Td(B" ; p .. w 45 ",Ti(B" ",TC(B" ",Th(B" ",TR(B" ",TJ(B" ",T7(B" ",TW(B" ",T9(B" ; h .. o
45 ",T;(B" ",TQ(B" ",T<(B" ",T0(B" ",To(B" "," ",T%(B" 0] ; x .. DEL 46 ",TB(B" ",Tf(B" ",T>(B" ",TK(B" ",TP(B" ",TU(B" ",TM(B" ",Td(B" ; p .. w
46 "A table which maps ASCII key codes to corresponding Thai characters." 47 ",T;(B" ",TQ(B" ",T<(B" ",T0(B" ",To(B" "." ",T%(B" 0] ; x .. DEL
47 ) 48 nil nil)
49
50 (pattachote
51 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
53 0 "+" ",T1(B" "/" "," "?" "_" ",T"(B" ; SPC .. '
54 "(" ")" "." "%" ",TP(B" ",Tq(B" ",T((B" ",T>(B" ; ( .. /
55 ",Tp(B" "=" ",Tr(B" ",Ts(B" ",Tt(B" ",Tu(B" ",TY(B" ",Tw(B" ; 0 .. 7
56 ",Tx(B" ",Ty(B" ",T&(B" ",Td(B" ",T?(B" ",Tv(B" ",T2(B" ",TL(B" ; 8 .. ?
57 "\"" ",Tk(B" ",TQ(B" ",T0(B" ",TS(B" ",Tf(B" ",T3(B" ",Tl(B" ; @ .. G
58 ",TW(B" ",T+(B" ",T<(B" ",T*(B" ",Tb(B" ",TN(B" ",TH(B" ",T6(B" ; H .. O
59 ",T2(B" ",Tj(B" ",T-(B" ",T8(B" ",TI(B" ",T=(B" ",T@(B" ",TD(B" ; P .. W
60 ",T.(B" ",TV(B" ",T.(B" ",Tc(B" ",TZ(B" ",T2(B" ",TX(B" "-" ; X .. _
61 ",T#(B" ",Ti(B" ",TT(B" ",TE(B" ",T'(B" ",TB(B" ",T!(B" ",TQ(B" ; ` .. g
62 ",TU(B" ",TA(B" ",TR(B" ",T9(B" ",T`(B" ",TJ(B" ",T$(B" ",TG(B" ; h .. o
63 ",Ta(B" ",Tg(B" ",TM(B" ",T7(B" ",TC(B" ",T4(B" ",TK(B" ",T5(B" ; p .. w
64 ",T;(B" ",Th(B" ",T:(B" ",TO(B" ",Tm(B" ",TF(B" ",T%(B" 0] ; x .. DEL
65 nil nil)
66 )
67 "Alist of Thai keyboard types vs. corresponding mapping tables.
68 Each element is a list of:
69 KEYBOARD-TYPE, ASCII-THAI-TABLE, CONSONANT-MAP-TEMPLATE,
70 and VOWEL-UPPER-LOWER-TEMPLATE.
71
72 KEYBOARD-TYPE is a symbol, one of kesmanee or pattachote.
73
74 ASCII-THAI-TABLE is a vector indexed by an ASCII key code
75 and the value is the one-char string of Thai character
76 assigned at the location of ASCII key on the specific Thai keyboard.
77 The value is 0 if no Thai character is assigned at the location.
78
79 CONSONANT-MAP-TEMPLATE is a template of a cdr part of a Quail map when
80 a consonant is entered.
81
82 VOWEL-UPPER-LOWER-TEMPLATE is a template of a cdr part of a Quail map
83 when a vowel upper or a vowel lower is entered.")
84
85 (defmacro thai-keyboard-info (keyboard-type)
86 `(assq ,keyboard-type thai-keyboard-mapping-alist))
48 87
49 ) 88 )
89
90 (defvar thai-current-keyboard-type nil
91 "Thai Keyboard type which Quail is assuming currently.
92 This variable is used in Quail internally only.")
50 93
51 ;; Template of a cdr part of a Quail map when a consonant is entered. 94 ;; Template of a cdr part of a Quail map when a consonant is entered.
52 (defvar thai-consonant-alist nil) 95 (defvar thai-consonant-alist nil)
53 ;; Template of a cdr part of a Quail map when a vowel upper or a vowel 96 ;; Template of a cdr part of a Quail map when a vowel upper or a vowel
54 ;; lower is entered. 97 ;; lower is entered.
59 ;; The cdr part of the map is a copy of ALIST. 102 ;; The cdr part of the map is a copy of ALIST.
60 (defun thai-generate-quail-map (key len alist) 103 (defun thai-generate-quail-map (key len alist)
61 (let ((str "") 104 (let ((str "")
62 (idx 0)) 105 (idx 0))
63 (while (< idx len) 106 (while (< idx len)
64 (setq str (concat str (aref thai-keyboard-mapping (aref key idx))) 107 (setq str (concat str (aref (nth 1 (thai-keyboard-info
108 thai-current-keyboard-type))
109 (aref key idx)))
65 idx (1+ idx))) 110 idx (1+ idx)))
66 (cons (string-to-char (compose-string str)) (copy-alist alist)))) 111 (cons (string-to-char (compose-string str)) (copy-alist alist))))
67 112
68 ;; Return a Quail map corresponding to KEY of length LEN when Thai 113 ;; Return a Quail map corresponding to KEY of length LEN when Thai
69 ;; tone mark is entered. 114 ;; tone mark is entered.
71 (thai-generate-quail-map key len nil)) 116 (thai-generate-quail-map key len nil))
72 117
73 ;; Return a Quail map corresponding to KEY of length LEN when Thai 118 ;; Return a Quail map corresponding to KEY of length LEN when Thai
74 ;; vowel upper or vowel lower is entered. 119 ;; vowel upper or vowel lower is entered.
75 (defun thai-vowel-upper-lower-input (key len) 120 (defun thai-vowel-upper-lower-input (key len)
76 (thai-generate-quail-map key len thai-vowel-upper-lower-alist)) 121 (thai-generate-quail-map
77 122 key len
78 ;; Return an alist which can be a cdr part of a Quail map 123 (nth 3 (thai-keyboard-info thai-current-keyboard-type))))
79 ;; corresponding to the current key when Thai consonant is entered.
80 (defun thai-consonant-input (key len)
81 (copy-alist thai-consonant-alist))
82
83 (quail-define-package "quail-thai" "Thai" "Thai" t
84 "Thai input method with TIS620 characters:
85
86 The difference from the ordinal Thai keyboard:
87 ',T_(B' and ',To(B' are assigned to '\\' and '|' respectively,
88 ',T#(B' and ',T%(B' are assigned to '`' and '~' respectively,
89 Don't know where to assign characters ',Tz(B' and ',T{(B'."
90 nil t t nil t)
91 124
92 ;; Define RULES in Quail map. In addition, create 125 ;; Define RULES in Quail map. In addition, create
93 ;; `thai-conconant-map' and `thai-vowel-upper-lower-alist' 126 ;; `thai-consonant-alist-KEYBOARD-TYPE' and
127 ;; `thai-vowel-upper-lower-alist-KEYBOARD-TYPE'.
128
94 ;; The general composing rules are as follows: 129 ;; The general composing rules are as follows:
95 ;; 130 ;;
96 ;; T 131 ;; T
97 ;; V T V T 132 ;; V T V T
98 ;; CV -> C, CT -> C, CVT -> C, Cv -> C, CvT -> C 133 ;; CV -> C, CT -> C, CVT -> C, Cv -> C, CvT -> C
99 ;; v v 134 ;; v v
100 ;; 135 ;;
101 ;; where C: consonant, V: vowel upper, v: vowel lower, T: tone mark. 136 ;; where C: consonant, V: vowel upper, v: vowel lower, T: tone mark.
102 137
103 (defmacro thai-quail-define-rules (&rest rules) 138 (defmacro thai-quail-define-rules (keyboard-type &rest rules)
104 (let ((l rules) 139 (let ((l rules)
105 consonant-alist 140 consonant-alist
106 vowel-upper-lower-alist 141 vowel-upper-lower-alist
107 rule trans ch c-set) 142 rule trans ch c-set)
108 (while l 143 (while l
125 vowel-upper-lower-alist 160 vowel-upper-lower-alist
126 (cons (cons (string-to-char (car rule)) 161 (cons (cons (string-to-char (car rule))
127 'thai-tone-input) 162 'thai-tone-input)
128 vowel-upper-lower-alist)))) 163 vowel-upper-lower-alist))))
129 (setq l (cdr l))) 164 (setq l (cdr l)))
130 (list 'progn 165 `(progn
131 (cons 'quail-define-rules rules) 166 (quail-define-rules ,@rules)
132 `(setq thai-consonant-alist ',consonant-alist 167 (setcar (nthcdr 2 (thai-keyboard-info ,keyboard-type))
133 thai-vowel-upper-lower-alist ',vowel-upper-lower-alist)))) 168 ',consonant-alist)
134 169 (setcar (nthcdr 3 (thai-keyboard-info ,keyboard-type))
135 (thai-quail-define-rules 170 ',vowel-upper-lower-alist))))
171
172 ;; Return an alist which can be a cdr part of a Quail map
173 ;; corresponding to the current key when Thai consonant is entered.
174 (defun thai-consonant-input (key len)
175 (let ((quail-package-name (quail-name)))
176 (setq thai-current-keyboard-type
177 (cond ((string= quail-package-name "thai-pattachote") 'pattachote)
178 ((string= quail-package-name "thai-kesmanee") 'kesmanee)
179 (t (error "Invalid Quail package %s" quail-package-name))))
180 (copy-alist (nth 2 (thai-keyboard-info thai-current-keyboard-type)))))
181
182 ;; Thai Kesmanee keyboard support.
183
184 (quail-define-package
185 "thai-kesmanee" "Thai" ",T!!(B>" t
186 "Thai Kesmanee input method with TIS620 keyboard layout
187
188 The difference from the ordinal Thai keyboard:
189 ',T_(B' and ',To(B' are assigned to '\\' and '|' respectively,
190 ',T#(B' and ',T%(B' are assigned to '`' and '~' respectively,
191 Don't know where to assign characters ',Tz(B' and ',T{(B'."
192 nil t t nil t nil nil nil nil nil t)
193
194 (thai-quail-define-rules 'kesmanee
136 ("1" (",TE(B" . thai-consonant-input)) 195 ("1" (",TE(B" . thai-consonant-input))
137 ("!" "#") 196 ("!" "#")
138 ("2" "/") 197 ("2" "/")
139 ("@" (",Tq(B" . thai-consonant-input)) 198 ("@" ",Tq(B")
140 ("3" "_") 199 ("3" "_")
141 ("#" (",Tr(B" . thai-consonant-input)) 200 ("#" ",Tr(B")
142 ("4" (",T@(B" . thai-consonant-input)) 201 ("4" (",T@(B" . thai-consonant-input))
143 ("$" (",Ts(B" . thai-consonant-input)) 202 ("$" ",Ts(B")
144 ("5" (",T6(B" . thai-consonant-input)) 203 ("5" (",T6(B" . thai-consonant-input))
145 ("%" (",Tt(B" . thai-consonant-input)) 204 ("%" ",Tt(B")
146 ("6" ",TX(B") 205 ("6" ",TX(B")
147 ("^" ",TY(B") 206 ("^" ",TY(B")
148 ("7" ",TV(B") 207 ("7" ",TV(B")
149 ("&" "0,TQi1(B") 208 ("&" "0,TQi1(B")
150 ("8" (",T$(B" . thai-consonant-input)) 209 ("8" (",T$(B" . thai-consonant-input))
151 ("*" (",Tu(B" . thai-consonant-input)) 210 ("*" ",Tu(B")
152 ("9" (",T5(B" . thai-consonant-input)) 211 ("9" (",T5(B" . thai-consonant-input))
153 ("\(" (",Tv(B" . thai-consonant-input)) 212 ("\(" ",Tv(B")
154 ("0" (",T((B" . thai-consonant-input)) 213 ("0" (",T((B" . thai-consonant-input))
155 ("\)" (",Tw(B" . thai-consonant-input)) 214 ("\)" ",Tw(B")
156 ("-" (",T"(B" . thai-consonant-input)) 215 ("-" (",T"(B" . thai-consonant-input))
157 ("_" (",Tx(B" . thai-consonant-input)) 216 ("_" ",Tx(B")
158 ("=" (",T*(B" . thai-consonant-input)) 217 ("=" (",T*(B" . thai-consonant-input))
159 ("+" (",Ty(B" . thai-consonant-input)) 218 ("+" ",Ty(B")
160 ("\\" (",T_(B" . thai-consonant-input)) 219 ("\\" ",T_(B")
161 ("|" (",To(B" . thai-consonant-input)) 220 ("|" ",To(B")
162 ("`" (",T#(B" . thai-consonant-input)) 221 ("`" (",T#(B" . thai-consonant-input))
163 ("~" (",T%(B" . thai-consonant-input)) 222 ("~" (",T%(B" . thai-consonant-input))
164 ("q" ",Tf(B") 223 ("q" ",Tf(B")
165 ("Q" ",Tp(B") 224 ("Q" ",Tp(B")
166 ("w" ",Td(B") 225 ("w" ",Td(B")
176 ("u" ",TU(B") 235 ("u" ",TU(B")
177 ("U" ",Tj(B") 236 ("U" ",Tj(B")
178 ("i" (",TC(B" . thai-consonant-input)) 237 ("i" (",TC(B" . thai-consonant-input))
179 ("I" (",T3(B" . thai-consonant-input)) 238 ("I" (",T3(B" . thai-consonant-input))
180 ("o" (",T9(B" . thai-consonant-input)) 239 ("o" (",T9(B" . thai-consonant-input))
181 ("O" (",TO(B" . thai-consonant-input)) 240 ("O" ",TO(B")
182 ("p" (",TB(B" . thai-consonant-input)) 241 ("p" (",TB(B" . thai-consonant-input))
183 ("P" (",T-(B" . thai-consonant-input)) 242 ("P" (",T-(B" . thai-consonant-input))
184 ("\[" (",T:(B" . thai-consonant-input)) 243 ("\[" (",T:(B" . thai-consonant-input))
185 ("{" (",T0(B" . thai-consonant-input)) 244 ("{" (",T0(B" . thai-consonant-input))
186 ("\]" (",TE(B" . thai-consonant-input)) 245 ("\]" (",TE(B" . thai-consonant-input))
226 ("," (",TA(B" . thai-consonant-input)) 285 ("," (",TA(B" . thai-consonant-input))
227 ("<" (",T2(B" . thai-consonant-input)) 286 ("<" (",T2(B" . thai-consonant-input))
228 ("." ",Tc(B") 287 ("." ",Tc(B")
229 (">" (",TL(B" . thai-consonant-input)) 288 (">" (",TL(B" . thai-consonant-input))
230 ("/" (",T=(B" . thai-consonant-input)) 289 ("/" (",T=(B" . thai-consonant-input))
231 ("\"" ",TF(B") 290 ("?" ",TF(B")
232 ) 291 )
233 292
293
294 ;; Thai Pattachote keyboard support.
295
296 (quail-define-package
297 "thai-pattachote" "Thai" ",T!;(B>" t
298 "Thai Pattachote input method with TIS620 keyboard layout"
299 nil t t nil t nil nil nil nil nil t)
300
301 (thai-quail-define-rules 'pattachote
302 ("1" "=")
303 ("!" "+")
304 ("2" ",Tr(B")
305 ("@" "\"")
306 ("3" ",Ts(B")
307 ("#" "/")
308 ("4" ",Tt(B")
309 ("$" ",")
310 ("5" ",Tu(B")
311 ("%" "?")
312 ("6" ",TY(B")
313 ("^" ",TX(B")
314 ("7" ",Tw(B")
315 ("&" "_")
316 ("8" ",Tx(B")
317 ("*" ".")
318 ("9" ",Ty(B")
319 ("(" "(")
320 ("0" ",Tp(B")
321 (")" ")")
322 ("-" ",Tq(B")
323 ("_" "-")
324 ("=" ",Tv(B")
325 ("+" "%")
326 ("\\" ",TZ(B")
327 ("|" ",Tm(B")
328 ("`" (",T#(B" . thai-consonant-input))
329 ("~" (",T%(B" . thai-consonant-input))
330
331 ("q" ",Tg(B")
332 ("Q" ",Tj(B")
333 ("w" (",T5(B" . thai-consonant-input))
334 ("W" ",TD(B")
335 ("e" (",TB(B" . thai-consonant-input))
336 ("E" ",Tf(B")
337 ("r" (",TM(B" . thai-consonant-input))
338 ("R" (",T-(B" . thai-consonant-input))
339 ("t" (",TC(B" . thai-consonant-input))
340 ("T" (",TI(B" . thai-consonant-input))
341 ("y" ",Th(B")
342 ("Y" ",TV(B")
343 ("u" (",T4(B" . thai-consonant-input))
344 ("U" (",T=(B" . thai-consonant-input))
345 ("i" (",TA(B" . thai-consonant-input))
346 ("I" (",T+(B" . thai-consonant-input))
347 ("o" (",TG(B" . thai-consonant-input))
348 ("O" (",T6(B" . thai-consonant-input))
349 ("p" ",Ta(B")
350 ("P" (",T2(B" . thai-consonant-input))
351 ("\[" ",Tc(B")
352 ("{" ",TO(B")
353 ("\]" (",T2(B" . thai-consonant-input))
354 ("}" ",TF(B")
355
356 ("a" ",Ti(B")
357 ("A" ",Tk(B")
358 ("s" (",T7(B" . thai-consonant-input))
359 ("S" (",T8(B" . thai-consonant-input))
360 ("d" (",T'(B" . thai-consonant-input))
361 ("D" ",TS(B")
362 ("f" (",T!(B" . thai-consonant-input))
363 ("F" (",T3(B" . thai-consonant-input))
364 ("g" ",TQ(B")
365 ("G" ",Tl(B")
366 ("h" ",TU(B")
367 ("H" ",TW(B")
368 ("j" ",TR(B")
369 ("J" (",T<(B" . thai-consonant-input))
370 ("k" (",T9(B" . thai-consonant-input))
371 ("K" (",T*(B" . thai-consonant-input))
372 ("l" ",T`(B")
373 ("L" ",Tb(B")
374 (";" ",Td(B")
375 (":" (",T&(B" . thai-consonant-input))
376 ("'" (",T"(B" . thai-consonant-input))
377 ("\"" (",T1(B" . thai-consonant-input))
378
379 ("z" (",T:(B" . thai-consonant-input))
380 ("Z" (",T.(B" . thai-consonant-input))
381 ("x" (",T;(B" . thai-consonant-input))
382 ("X" (",T.(B" . thai-consonant-input))
383 ("c" (",TE(B" . thai-consonant-input))
384 ("C" (",T0(B" . thai-consonant-input))
385 ("v" (",TK(B" . thai-consonant-input))
386 ("V" (",T@(B" . thai-consonant-input))
387 ("b" ",TT(B")
388 ("B" ",TQ(B")
389 ("n" (",T$(B" . thai-consonant-input))
390 ("N" (",TH(B" . thai-consonant-input))
391 ("m" (",TJ(B" . thai-consonant-input))
392 ("M" (",TN(B" . thai-consonant-input))
393 ("," ",TP(B")
394 ("<" (",T?(B" . thai-consonant-input))
395 ("." (",T((B" . thai-consonant-input))
396 (">" (",T2(B" . thai-consonant-input))
397 ("/" (",T>(B" . thai-consonant-input))
398 ("?" (",TL(B" . thai-consonant-input))
399 )
400
234 ;;; quail/thai.el ends here 401 ;;; quail/thai.el ends here