1 ;;; egg-sim.el --- EGG Simple Input Method
3 ;; Copyright (C) 2000 Electrotechnical Laboratory, JAPAN.
4 ;; Licensed to the Free Software Foundation.
5 ;; Copyright (C) 2000 TOMURA Satoru <tomura@etl.go.jp>
8 ;; Author: TOMURA Satoru <tomura@etl.go.jp>
10 ;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
12 ;; Keywords: mule, multilingual, input method
14 ;; This file is part of EGG.
16 ;; EGG is free software; you can redistribute it and/or modify
17 ;; it under the terms of the GNU General Public License as published by
18 ;; the Free Software Foundation; either version 2, or (at your option)
21 ;; EGG is distributed in the hope that it will be useful,
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 ;; GNU General Public License for more details.
26 ;; You should have received a copy of the GNU General Public License
27 ;; along with GNU Emacs; see the file COPYING. If not, write to the
28 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
29 ;; Boston, MA 02111-1307, USA.
35 ;;; This code is based on egg-jsymbol.el of Egg V3.
37 ;;; 92.10.18 modified for Mule Ver.0.9.6 by K.Handa <handa@etl.go.jp>
39 ;;; 92.12.26 modified for Mule Ver.0.9.7 by T.Shingu <shingu@cpr.canon.co.jp>
40 ;;; JIS Hojo Kanji support.
46 (defun make-char-list (charset &optional from to)
48 (chars (charset-chars charset))
50 (setq min (if (= chars 96) 32 33)
51 max (if (= chars 96) 127 126))
52 (setq from (if from (+ min (1- from)) min)
53 to (if to (+ min (1- to)) max))
56 (cond ((= (charset-dimension charset) 1)
58 (setq result (cons (char-to-string
59 (make-char charset to))
63 ((= (charset-dimension charset) 2)
67 (setq result (cons (char-to-string
68 (make-char charset to code))
74 (defvar egg-sim-ascii-menu
75 '(menu "ASCII:" ,(make-char-list 'ascii)))
77 (defvar egg-sim-latin-1-menu
78 `(menu "ISO 8859-1:" ,(make-char-list 'latin-iso8859-1)))
80 (defvar egg-sim-latin-2-menu
81 `(menu "ISO 8859-2:" ,(make-char-list 'latin-iso8859-2)))
83 (defvar egg-sim-latin-3-menu
84 `(menu "ISO 8859-3:" ,(make-char-list 'latin-iso8859-3)))
86 (defvar egg-sim-latin-4-menu
87 `(menu "ISO 8859-4:" ,(make-char-list 'latin-iso8859-4)))
89 (defvar egg-sim-latin-5-menu
90 `(menu "ISO 8859-9:" ,(make-char-list 'latin-iso8859-9)))
92 (defvar egg-sim-cyrillic-menu
93 `(menu "ISO 8859-5:" ,(make-char-list 'cyrillic-iso8859-5)))
95 (defvar egg-sim-arabic-menu
96 `(menu "ISO 8859-6:" ,(make-char-list 'arabic-iso8859-6)))
98 (defvar egg-sim-greek-menu
99 `(menu "ISO 8859-7:" ,(make-char-list 'greek-iso8859-7)))
101 (defvar egg-sim-hebrew-menu
102 `(menu "ISO 8859-8:" ,(make-char-list 'hebrew-iso8859-8)))
104 (defvar egg-sim-thai-menu
105 `(menu "TIS620.2529:" ,(make-char-list 'thai-tis620)))
107 (defvar egg-sim-lao-menu
108 `(menu "lao:" ,(make-char-list 'lao)))
110 (defvar egg-sim-vietnamese-menu
112 (("VISCII1.1(lower-case)" .
113 (menu "VISCII1.1 lower-case:"
114 ,(make-char-list 'vietnamese-viscii-lower)))
115 ("VISCII1.1(upper-case)" .
116 (menu "VISCII1.1 upper-case:"
117 ,(make-char-list 'vietnamese-viscii-upper))))))
119 (defvar egg-sim-chinese-big5-menu
122 (menu "Big 5 Level1:" , (make-char-list 'chinese-big5-1)))
124 (menu "Big 5 Level2:" , (make-char-list 'chinese-big5-2))))))
126 (defvar egg-sim-chinese-cns-menu
129 (menu "CNS 11643-1:" ,(make-char-list 'chinese-cns11643-1)))
131 (menu "CNS 11643-2:" ,(make-char-list 'chinese-cns11643-2)))
133 (menu "CNS 11643-3:" ,(make-char-list 'chinese-cns11643-3)))
135 (menu "CNS 11643-4:" ,(make-char-list 'chinese-cns11643-4)))
137 (menu "CNS 11643-5:" ,(make-char-list 'chinese-cns11643-5)))
139 (menu "CNS 11643-6:" ,(make-char-list 'chinese-cns11643-6)))
141 (menu "CNS 11643-7:" ,(make-char-list 'chinese-cns11643-7))))))
143 (defvar egg-sim-chinese-gb-menu
146 (menu "GB 2312:" ,(make-char-list 'chinese-gb2312)))
148 (menu "GB2312/1:" ,(make-char-list 'chinese-gb2312 1 1)))
150 (menu "GB2312/2:" ,(make-char-list 'chinese-gb2312 2 2)))
152 (menu "GB2312/3:" ,(make-char-list 'chinese-gb2312 3 3)))
154 (menu "GB2312/4:" ,(make-char-list 'chinese-gb2312 4 4)))
156 (menu "GB2312/5:" ,(make-char-list 'chinese-gb2312 5 5)))
158 (menu "GB2312/6:" ,(make-char-list 'chinese-gb2312 6 6)))
160 (menu "GB2312/7:" ,(make-char-list 'chinese-gb2312 7 7)))
162 (menu "GB2312/8:" ,(make-char-list 'chinese-gb2312 8 8)))
164 (menu "GB2312/9:" ,(make-char-list 'chinese-gb2312 9 9)))
167 (defvar egg-sim-chinese-menu
169 (("GB2312" . , egg-sim-chinese-gb-menu)
170 ("CNS11643" . , egg-sim-chinese-cns-menu)
171 ("Big5" . , egg-sim-chinese-big5-menu))))
173 (defvar egg-sim-korean-menu
176 (menu "KSC 5601:" ,(make-char-list 'korean-ksc5601)))
178 (menu "KSC 5601/1-2:" ,(make-char-list 'korean-ksc5601 1 2)))
180 (menu "KSC 5601/3:" , (make-char-list 'korean-ksc5601 3 3)))
182 (menu "KSC 5601/4:" , (make-char-list 'korean-ksc5601 4 4)))
183 ("Roman Number/Greek" .
184 (menu "KSC 5601/5:" , (make-char-list 'korean-ksc5601 5 5)))
186 (menu "KSC 5601/6:" , (make-char-list 'korean-ksc5601 6 6)))
188 (menu "KSC 5601/7:" , (make-char-list 'korean-ksc5601 7 7)))
190 (menu "KSC 5601/8-9:" , (make-char-list 'korean-ksc5601 8 9)))
192 (menu "KSC 5601/10:" , (make-char-list 'korean-ksc5601 10 10)))
194 (menu "KSC 5601/11:" , (make-char-list 'korean-ksc5601 11 11)))
196 (menu "KSC 5601/12:" , (make-char-list 'korean-ksc5601 12 12)))
198 (menu "KSC 5601/16-40:" , (make-char-list 'korean-ksc5601 16 40)))
200 (menu "KSC 5601/42-93:" , (make-char-list 'korean-ksc5601 42 93))))))
202 (defvar egg-sim-japanese-menu
205 ,(append (make-char-list 'latin-jisx0201)
206 (make-char-list 'katakana-jisx0201)))
208 (menu "JIS X 0208:" ,(make-char-list 'japanese-jisx0208)))
210 (menu "JIS X 0212:" ,(make-char-list 'japanese-jisx0212)))
212 (menu "
\e$B5-9fF~NO
\e(B:"
213 (("JIS
\e$BF~NO
\e(B" . japanese-jisx0208)
215 (menu "
\e$B5-9f
\e(B:" , (make-char-list 'japanese-jisx0208 1 2)))
217 (menu "
\e$B1Q?t;z
\e(B:" , (make-char-list 'japanese-jisx0208 3 3)))
218 ("
\e$B$R$i$,$J
\e(B" .
219 (menu "
\e$B$R$i$,$J
\e(B:" , (make-char-list 'japanese-jisx0208 4 4)))
220 ("
\e$B%+%?%+%J
\e(B" .
221 (menu "
\e$B%+%?%+%J
\e(B:" , (make-char-list 'japanese-jisx0208 5 5)))
222 ("
\e$B%.%j%7%cJ8;z
\e(B" .
223 (menu "
\e$B%.%j%7%cJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 6 6)))
224 ("
\e$B%-%j%kJ8;z
\e(B" .
225 (menu "
\e$B%-%j%kJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 7 7)))
227 (menu "
\e$B7S@~
\e(B:" , (make-char-list 'japanese-jisx0208 8 8)))
228 ;;;"
\e$BIt<sF~NO
\e(B" (bushyu-input)
229 ;;; "
\e$B2h?tF~NO
\e(B" (kakusuu-input)
230 ("
\e$BBh0l?e=`
\e(B" .
231 (menu "
\e$BBh0l?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 16 47)))
232 ("
\e$BBhFs?e=`
\e(B" .
233 (menu "
\e$BBhFs?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 48 84)))
234 ("
\e$BJd=u4A;z
\e(B" .
235 (menu "
\e$BJd=u4A;z
\e(B:" , (make-char-list 'japanese-jisx0212 2 77)))))))))
237 (defvar egg-sim-ipa-menu
238 `(menu "IPA:" ,(make-char-list 'ipa)))
240 (defvar egg-sisheng-menu
241 `(menu "SiSheng characters" ,(make-char-list 'chinese-sisheng)))
243 (defvar egg-sim-code-input-menu
245 (("JISX0208" . japanese-jisx0208)
246 ("JISX0212" . japanese-jisx0212)
247 ("CNS11643-1" . chinese-cns11634-1)
248 ("CNS11643-2" . chinese-cns11634-2)
249 ("CNS11643-3" . chinese-cns11634-3)
250 ("CNS11643-4" . chinese-cns11634-4)
251 ("CNS11643-5" . chinese-cns11634-5)
252 ("CNS11643-6" . chinese-cns11634-6)
253 ("CNS11643-7" . chinese-cns11634-7)
254 ("Big5-1" . chinese-big5-1)
255 ("Big5-2" . chinese-big5-2)
256 ("GB2312" . chinese-gb2312)
257 ("KSC5601" . korean-ksc5601))))
259 (defvar egg-simple-input-method-menu-item-list
260 `(("Code Input" . ,egg-sim-code-input-menu)
261 ("Arabic" . , egg-sim-arabic-menu)
262 ("ASCII" . , egg-sim-ascii-menu)
263 ("Chinese" . , egg-sim-chinese-menu)
264 ("Cyrillic" . , egg-sim-cyrillic-menu)
265 ("Greek" . , egg-sim-greek-menu)
266 ("Hebrew" . , egg-sim-hebrew-menu)
267 ("Japanese" . , egg-sim-japanese-menu)
268 ("Korean" . , egg-sim-korean-menu)
271 (("Latin-1" . , egg-sim-latin-1-menu)
272 ("Latin-2" . , egg-sim-latin-2-menu)
273 ("Latin-3" . , egg-sim-latin-3-menu)
274 ("Latin-4" . , egg-sim-latin-4-menu)
275 ("Latin-5" . , egg-sim-latin-5-menu))))
278 (("Thai" . , egg-sim-thai-menu)
279 ("Lao" . , egg-sim-lao-menu))))
280 ("Vietnamese" . , egg-sim-vietnamese-menu)
282 (menu "Phonetic code:"
283 (("SISHENG" . , egg-sisheng-menu)
284 ("IPA" . , egg-sim-ipa-menu))))
287 (defvar egg-language-environment-alist
288 `(("ASCII" . , egg-sim-ascii-menu)
289 ("Chinese-BIG5" . , egg-sim-chinese-big5-menu)
290 ("Chinese-CNS" . , egg-sim-chinese-cns-menu)
291 ("Chinese-GB" . , egg-sim-chinese-gb-menu)
292 ("Cyrillic-ISO" . , egg-sim-cyrillic-menu)
293 ("Cyrillic-KOI8" . , egg-sim-cyrillic-menu)
294 ("Cyrillic-ALT" . , egg-sim-cyrillic-menu)
295 ("Czech" . , egg-sim-latin-2-menu)
297 ("English" . , egg-sim-ascii-menu)
299 ("German" . , egg-sim-latin-1-menu)
300 ("Greek" . , egg-sim-greek-menu)
301 ("Hebrew" . , egg-sim-hebrew-menu)
303 ("IPA" . , egg-sim-ipa-menu)
304 ("Japanese" . , egg-sim-japanese-menu)
305 ("Korean" . , egg-sim-korean-menu)
306 ("Lao" . , egg-sim-lao-menu)
307 ("Latin-1" . , egg-sim-latin-1-menu)
308 ("Latin-2" . , egg-sim-latin-2-menu)
309 ("Latin-3" . , egg-sim-latin-3-menu)
310 ("Latin-4" . , egg-sim-latin-4-menu)
311 ("Latin-5" . , egg-sim-latin-5-menu)
312 ("Romaian" . , egg-sim-latin-2-menu)
313 ("Slovenian" . , egg-sim-latin-2-menu)
314 ("Slovak" . , egg-sim-latin-2-menu)
315 ("Thai" . , egg-sim-thai-menu)
317 ("Turkish" . , egg-sim-latin-5-menu)
318 ("Vietnamese" . , egg-sim-vietnamese-menu)))
320 (defvar egg-simple-input-method-menu
321 `(menu "Character set:" , egg-simple-input-method-menu-item-list))
324 (defun egg-simple-input-method()
326 (let ((result (egg-simple-input-menu)))
327 (cond((stringp result)
330 (egg-character-code-input result
331 (format "%s/Character Code in Hexadecimal:"
332 (charset-description result)))))))
334 (defun egg-simple-input-menu ()
335 (let ((menu (cdr-safe (assoc current-language-environment
336 egg-language-environment-alist))))
339 `(menu "Character set:" ,(cons (cons current-language-environment
341 egg-simple-input-method-menu-item-list)))
342 (menudiag-select egg-simple-input-method-menu))))
344 (defun egg-character-code-input (charset prompt)
345 (egg-insert-character-code-from-minibuffer charset prompt))
347 (defun egg-insert-character-code-from-minibuffer (charset prompt)
348 (let ((str (read-from-minibuffer prompt)) val)
349 (while (null (setq val (egg-read-character-code-from-string str charset)))
351 (setq str (read-from-minibuffer prompt str)))
352 (insert (make-char charset (car val) (cdr val)))))
354 (defun egg-hexadigit-value (ch)
355 (cond((and (<= ?0 ch) (<= ch ?9))
357 ((and (<= ?a ch) (<= ch ?f))
359 ((and (<= ?A ch) (<= ch ?F))
362 (defun egg-read-character-code-from-string (str charset)
363 (if (and (= (length str) 4)
364 (<= 2 (egg-hexadigit-value (aref str 0)))
365 (egg-hexadigit-value (aref str 1))
366 (<= 2 (egg-hexadigit-value (aref str 2)))
367 (egg-hexadigit-value (aref str 3)))
368 (let ((code1 (+ (* 16 (egg-hexadigit-value (aref str 0)))
369 (egg-hexadigit-value (aref str 1))))
370 (code2 (+ (* 16 (egg-hexadigit-value (aref str 2)))
371 (egg-hexadigit-value (aref str 3))))
372 (min (if (= (charset-chars charset) 94)
374 (max (if (= (charset-chars charset) 94)
380 (cons code1 code2)))))
386 (defun make-non-iso2022-code-table-file (name)
388 (set-buffer-multibyte nil)
389 (insert ";;; -*- coding: -*-\n\n")
394 (insert (format " %X " i))
401 (insert (format "----" i))
407 (insert (format "%X|" i))
410 (insert (format " \"%c\"" c))
413 (insert (format "\n")))
416 (defun make-iso2022-94char-code-table-file (name)
418 (set-buffer-multibyte nil)
419 (insert ";;; -*- coding: -*-\n\n")
423 (insert (format " %X " i))
430 (insert (format "----" i))
436 (insert (format "%X|" i))
445 (insert (format " \"%c\"" c)))
448 (insert (format "\n")))
451 (defun make-iso2022-96char-code-table-file (name)
453 (set-buffer-multibyte nil)
454 (insert ";;; -*- coding: -*-\n\n")
458 (insert (format " %X " i))
465 (insert (format "----" i))
471 (insert (format "%X|" i))
479 (insert (format " \"%c\"" c)))
482 (insert (format "\n")))
485 (defun make-euc-code-table-file (name)
487 (set-buffer-multibyte nil)
488 (insert ";;; -*- coding: -*-\n\n")
493 (insert (format " %02d " i))
500 (insert (format "-----" i))
506 (insert (format "%02d|" i))
509 (insert (format " \"%c%c\""
513 (insert (format "\n")))